c++ - VS 2015 que compila el error cocos2d-x 3.3 "error fatal C1189:#error: la definición de macro de snprintf entra en conflicto con la declaración de la función Biblioteca estándar"
visual-studio-2015 (3)
Cuando compilo cocos2d-x (versión 3.3) usando Visual Studio 2015, ocurrió un error que decía:
error fatal C1189: #error: la definición de macro de snprintf entra en conflicto con la declaración de la función Biblioteca estándar (编译 源 / .. / base / s3tc.cpp)
El código fuente es:
#ifdef snprintf
#error Macro definition of snprintf conflicts with Standard Library
function declaration
#endif
¿Alguien puede decirme qué pasa?
Hasta ahora, muchas bibliotecas y programas usaban la función snprintf()
definiéndola como _snprintf()
, ya que _snprintf()
era compatible.
#define snprintf _snprintf
Finalmente, Visual Studio 14 define snprintf()
!
Desde entonces, snprintf()
ahora es oficialmente compatible. Nunca deberíamos # definirlo.
Hacerlo eclipsará la nueva función snprintf()
definida en stdio.h.
Para restringir eso, esto se agrega en stdio.h
#ifdef snprintf
#error: Macro definition of snprintf conflicts with Standard Library function declaration”
#endif
Por lo tanto, su código no compila.
Es cierto que en todas las versiones anteriores de Visual Studio, debe usar la función _snprintf()
. Pero VS 2014 en adelante, no debería _snprintf()
con _snprintf()
.
En algún lugar de tu código o muy probablemente en los encabezados de cocos
, esto está hecho y, por lo tanto, el error.
Compruebe eso y elimine ese #define.
snprintf()
es parte de las especificaciones C99.
Para habilitar el soporte C99
agregue esto en su programa
#if _MSC_VER>=1900
# define STDC99
#endif
En caso de que no sepa qué valores de macro _MSC_VER son
...
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
Simplemente encuentre la definición de snprintf
en su código y VS2015
mientras está en VS2015
.
Algo como:
#if _MSC_VER < 1900 //vs2015 already have this function
#define snprintf _snprintf_s
#endif
user1 es correcto
Pero incluso si resuelve el problema de esta manera, es probable que tenga problemas con los conectores de las bibliotecas preconstruidas.
La forma de evitar esto es cambiar el conjunto de herramientas de la plataforma en todos los proyectos a Visual Studio 2013 (v120)
Y en la página del enlazador / entrada de datos, agregue libcmt.lib para Ignorar bibliotecas predeterminadas específicas: libcmt.lib ; libcmtd.lib; ...