c++ cocos2d-x visual-studio-2015

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