2015-01-03 5 views
32

Wenn ich cocos2d-x (Version 3.3) mit Visual Studio 2015 kompilieren, ein Fehler aufgetreten, sagen :VS 2015 compiling cocos2d-x 3.3 Fehler "fataler Fehler C1189: #error: Makrodefinition von snprintf Konflikte mit Standard-Bibliothek Funktionsdeklaration"

fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration (编译源文件 ..\base\s3tc.cpp)

Der Quellcode ist:

#ifdef snprintf 
    #error Macro definition of snprintf conflicts with Standard Library 
      function declaration 
#endif 

Wer kann mir sagen, was falsch ist?

Antwort

51

Bis jetzt, viele Bibliotheken & Programme snprintf() Funktion verwendet, indem Sie es als _snprintf() definieren, da _snprintf() unterstützt wurde.

#define snprintf _snprintf 

Schließlich definiert Visual Studio 14 snprintf()!

Seit, snprintf() wird jetzt offiziell unterstützt. Wir sollten es niemals # definieren.

Dies wird die neue Funktion snprintf() überschatten, die in stdio.h definiert ist.

Um das zu beschränken, wird diese

#ifdef snprintf 
    #error: Macro definition of snprintf conflicts with Standard Library function declaration” 
#endif 

daher in stdio.h hinzugefügt, der Code nicht kompiliert.

Es stimmt, dass Sie in allen früheren Versionen von Visual Studio die Funktion _snprintf() verwenden müssen. Aber VS ab 2014 sollte nicht mit _snprintf() definiert werden.

Irgendwo in Ihrem Code oder höchstwahrscheinlich in cocos Header, dies ist getan und daher der Fehler.

Überprüfen Sie das und entfernen Sie das #define.

snprintf() ist Teil der C99-Spezifikationen.

C99 Unterstützung

fügen Sie diese in Ihrem Programm

#if _MSC_VER>=1900 
# define STDC99 
#endif 

Bei Damit wissen Sie nicht, was _MSC_VER Makrowerte

... 
MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) 
MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013) 
MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012) 
MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010) 
MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008) 
MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005) 
MSVC++ 7.1 _MSC_VER == 1310 (Visual Studio .NET 2003) 
MSVC++ 7.0 _MSC_VER == 1300 
MSVC++ 6.0 _MSC_VER == 1200 
MSVC++ 5.0 _MSC_VER == 1100 
MSVC++ 4.0 _MSC_VER == 1000 
MSVC++ 2.0 _MSC_VER == 900 
MSVC++ 1.0 _MSC_VER == 800 
C/C++ 7.0 _MSC_VER == 700 
C  6.0 _MSC_VER == 600 
+0

Bitte beachten Sie, dass '#define snprintf _snprintf' nie verwendet werden soll. Es ist unsicher, da '_snprintf()' keine Null-Terminierung garantiert im Gegensatz zu 'snprintf()' von C99. Es gibt auch andere Unterschiede. – cremno

+0

@cremno, Ist das dein Kommentar oder deine Antwort? Ich denke, Sie haben den ganzen Punkt, den ich hier mache, falsch verstanden. – user1

+0

Es ist nur ein Kommentar. Deine Antwort ist in Ordnung. – cremno

3

benutzer1 sind richtig ist

Aber selbst wenn Sie das Problem auf diese Weise beheben, werden Sie wahrscheinlich Probleme mit Linkern mit vorgefertigten haben Bibliotheken.

Der Weg, dies zu vermeiden, ist Plattform-Toolset auf allen Projekten Visual Studio 2013 (v120)

Und Linker/Input propry Seite hinzufügen libcmt.lib Bibliotheken Specific Standard Ignorieren zu ändern: LIBCMT. lib; libcmtd.lib; ...

+5

OP und andere, die dieses Problem nachschlagen, werden wahrscheinlich nicht den Luxus haben, bei VS2013 zu bleiben, nur um einen Fehler zu vermeiden. –

+2

@kayleeFrye_onDeck, Benutzer1185287 schlägt nicht vor, VS2013 zu verwenden, aber um das ** Toolset ** zum Kompilieren zu ändern, von den Projekteigenschaften (Registerkarte Allgemein) direkt von VS2015 – Chris

+0

I gotcha. Der Punkt, in seiner Essenz, steht jedoch noch. Wir alle müssen schließlich "Trade-up" :) –

1

Finden Sie einfach die Definition von snprintf in Ihrem Code und undefine es während auf VS2015.
Etwas wie:

#if _MSC_VER < 1900 //vs2015 already have this function 
#define snprintf _snprintf_s 
#endif