VS 2015编译cocos2d-x 3.3错误"致命错误C1189:#error:snprintf的宏定义与标准库函数声明冲突"

时间:2015-01-03 11:48:49

标签: c++ cocos2d-x visual-studio-2015

当我使用visual studio 2015编译cocos2d-x(版本3.3)时,发生错误,说:

  

致命错误C1189:#error:snprintf的宏定义与标准库函数声明冲突(编译源文件.. \ base \ s3tc.cpp)

源代码是:

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

任何人都可以告诉我出了什么问题?

3 个答案:

答案 0 :(得分:60)

到目前为止,许多图书馆和程序使用snprintf()函数将其定义为_snprintf(),因为_snprintf()已得到支持。

#define snprintf _snprintf

最后,Visual Studio 14定义了snprintf()

此后,snprintf()现已获得官方支持。我们永远不应该#define它。

这样做会掩盖stdio.h中定义的新snprintf()函数。

为了限制它,这是在stdio.h中添加的

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

因此,您的代码无法编译。

在所有以前版本的Visual Studio中,您必须使用_snprintf()函数。但是VS 2014以后你不应该用_snprintf() #define它。

代码中的某个位置或最有可能位于cocos标题中,这已经完成,因此会出错。

检查并删除#define。

snprintf()是C99规范的一部分。

启用C99支持

在程序中添加

#if _MSC_VER>=1900
#  define STDC99
#endif

如果您不知道_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

答案 1 :(得分:4)

只需在代码中找到snprintf的定义,并在VS2015上取消定义。
类似的东西:

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

答案 2 :(得分:3)

user1是对的

但即使您以这种方式修复问题,您也可能会遇到预构建库的链接器问题。

避免这种情况的方法是将所有项目的平台工具集更改为 Visual Studio 2013(v120)

在linker / input propry页面中,将libcmt.lib添加到Ignore Specific Default库: libcmt.lib ; libcmtd.lib; ...