2015-01-03 14 views
32

Quando compilo cocos2d-x (versione 3.3) utilizzando Visual Studio 2015, si è verificato un errore, :VS 2015 compilazione di errore cocos2d-x 3.3 "errore fatale C1189: #error: la definizione macro di snprintf è in conflitto con la dichiarazione di funzione della libreria standard"

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

Il codice sorgente è:

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

Qualcuno mi può dire cosa c'è che non va?

risposta

51

Fino ad ora, Molte biblioteche & programmi usati snprintf() funzione definendo come _snprintf(), dal momento che _snprintf() è stato sostenuto.

#define snprintf _snprintf 

Infine, Visual Studio 14 definisce snprintf()!

Poiché, snprintf() è ora ufficialmente supportato. Non dovremmo mai # definirlo.

Fare ciò oscurerà la nuova funzione snprintf() definita in stdio.h.

Per limitare questo, questo viene aggiunto in stdio.h

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

Quindi, il codice non viene compilato.

È vero che su tutte le versioni precedenti di Visual Studio, è necessario utilizzare la funzione _snprintf(). Ma dal 2014 in poi non dovresti # definirlo con _snprintf().

Da qualche parte nel codice o molto probabilmente nelle intestazioni cocos, questo è fatto e quindi l'errore.

Verificare che e rimuovere tale #define.

snprintf() fa parte delle specifiche C99.

per abilitare il supporto C99

aggiungere questo nel vostro programma

#if _MSC_VER>=1900 
# define STDC99 
#endif 

Nel caso in cui non si sa cosa _MSC_VER valori macro sono

... 
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

prega di notare che '#define snprintf _snprintf' non dovrebbe mai essere utilizzato. Non è sicuro dato che '_snprintf()' non garantisce la terminazione nulla a differenza di 'snprintf()' di C99. Ci sono anche altre differenze. – cremno

+0

@ cremno, questo è il tuo commento o la risposta? Penso che tu abbia frainteso l'intero punto che sto facendo qui. – user1

+0

È solo un commento. La tua risposta va bene. – cremno

3

user1 è giusto

Ma anche se risolvi il problema in questo modo, probabilmente avrai problemi con il linker con la versione precompilata librerie.

Il modo per evitare questo è di cambiare piattaforma set di strumenti su tutti i progetti di Visual Studio 2013 (V120)

E nella pagina propry/ingresso linker aggiungere LIBCMT.LIB Ignora librerie specifiche predefinite: LIBCMT. lib; libcmtd.lib; ...

+5

OP e altri che cercano questo problema probabilmente non avranno il lusso di attenersi a VS2013 solo per evitare un errore. –

+2

@kayleeFrye_onDeck, l'utente 1185287 non sta suggerendo di utilizzare VS2013, ma di modificare il ** set di strumenti ** utilizzato per compilare, dalle proprietà del progetto (scheda Generale) direttamente da VS2015 – Chris

+0

. Il punto, nella sua essenza, resta comunque. Alla fine dovremo "scambiare" :) –

1

Basta trovare la definizione di snprintf nel codice e annullarla mentre su VS2015.
Qualcosa di simile:

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