web-dev-qa-db-fra.com

VS 2015 lors de la compilation de l'erreur cocos2d-x 3.3 "erreur fatale C1189: #error: la définition de macro des conflits snprintf avec la déclaration de fonction de la bibliothèque standard"

Lorsque je compile cocos2d-x (version 3.3) à l'aide de Visual Studio 2015, une erreur s'est produite, disant:

erreur fatale C1189: #error: définition de macro de snprintf en conflit avec la déclaration de fonction de la bibliothèque standard (编译 源 文件 ..\base\s3tc.cpp)

Le code source est:

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

Quelqu'un peut-il me dire ce qui ne va pas?

36
Jared

Jusqu'à présent, de nombreuses bibliothèques et programmes utilisaient la fonction snprintf() en la définissant comme _snprintf(), car _snprintf() était prise en charge.

#define snprintf _snprintf

Enfin, Visual Studio 14 définit snprintf()!

Depuis, snprintf() est maintenant officiellement supporté. Nous ne devons jamais le définir.

Le faire occultera la nouvelle fonction snprintf() définie dans stdio.h.

Pour restreindre cela, cela est ajouté dans stdio.h

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

Par conséquent, votre code ne compile pas.

Il est vrai que sur toutes les versions précédentes de Visual Studio, vous devez utiliser la fonction _snprintf(). Mais à partir de VS 2014, vous ne devez pas le #définir avec _snprintf().

Quelque part dans votre code ou très probablement dans les en-têtes cocos, cela est fait et d'où l'erreur.

Vérifiez cela et supprimez ce #define.

snprintf() fait partie des spécifications C99.

Pour activer la prise en charge C99

ajoutez ceci dans votre programme

#if _MSC_VER>=1900
#  define STDC99
#endif

Si vous ne savez pas quelles sont les valeurs des macros _MSC_VER

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

Trouvez simplement la définition de snprintf dans votre code et indéfinissez-la lorsque vous êtes sur VS2015.
Quelque chose comme:

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

user1 a raison

Mais même si vous résolvez le problème de cette façon, vous rencontrerez probablement des problèmes de l'éditeur de liens avec les bibliothèques prédéfinies.

Pour éviter cela, modifiez le jeu d'outils de la plateforme sur tous les projets en Visual Studio 2013 (v120)

Et dans la page linker/input propry, ajoutez libcmt.lib aux bibliothèques Ignore Specific Default: libcmt.lib; libcmtd.lib; ...

3
user1185287