C++ VS 2015编译cocos2d-x 3.3错误“;致命错误C1189:“错误:snprintf的宏定义与标准库函数声明冲突”;

C++ VS 2015编译cocos2d-x 3.3错误“;致命错误C1189:“错误:snprintf的宏定义与标准库函数声明冲突”;,c++,cocos2d-x,visual-studio-2015,C++,Cocos2d X,Visual Studio 2015,当我使用visual studio 2015编译cocos2d-x(3.3版)时,出现了一个错误,错误是: 致命错误C1189:#错误:snprintf的宏定义与标准库函数声明冲突(编译源文件 ..\base\s3tc.cpp) 源代码是: #ifdef snprintf #error Macro definition of snprintf conflicts with Standard Library function declaration #endif

当我使用visual studio 2015编译cocos2d-x(3.3版)时,出现了一个错误,错误是:

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

源代码是:

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

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

直到现在,许多库和程序使用
snprintf()
函数,将其定义为
\u snprintf()
,因为
\u snprintf()
是受支持的

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

自那时起,
snprintf()
现在得到官方支持。我们不应该给它下定义

这样做将使stdio.h中定义的新的
snprintf()
函数黯然失色

为了限制这一点,在stdio.h中添加了这一点

#ifdef snprintf
    #error: Macro definition of snprintf conflicts with Standard Library function declaration”
#endif
因此,您的代码不会编译

的确,在所有早期版本的Visual Studio上,都必须使用
\u snprintf()
函数。但是从2014年开始,你不应该用
\u snprintf()
来定义它

在代码中的某个地方,或者最有可能在
cocos
标题中,这样做了,因此出现了错误

检查并移除#定义

snprintf()
是C99规范的一部分

要启用C99支持

将此添加到您的程序中

#if _MSC_VER>=1900
#  define STDC99
#endif
如果您不知道宏值是什么

...
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
user1是对的

但是,即使您以这种方式解决了这个问题,您也可能会面临预构建库的链接器问题

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


并在linker/input propry页面中添加libcmt.lib以忽略特定的默认库:libcmt.lib;libcmtd.lib

只需在代码中找到
snprintf
的定义,并在
VS2015
上取消定义即可
比如:

#if _MSC_VER < 1900 //vs2015 already have this function
#define snprintf _snprintf_s 
#endif
#如果_MSC_VER<1900//vs2015已经具有此功能
#定义snprintf\u snprintf\s
#恩迪夫

OP和其他查找此问题的人可能不会为了避免错误而奢侈地坚持使用VS2013。@kayleeFrye_onDeck,user1185287并不建议使用VS2013,而是直接从VS2015I获取的项目属性(常规选项卡)更改用于编译的工具集。不过,从本质上讲,这一点仍然存在。我们最终都必须“向上交易”:)请注意,
#define snprintf(u snprintf
永远不应该被使用。这是不安全的,因为不像C99的
snprintf()
那样,snprintf()不能保证空终止。还有其他不同之处。@cremno,这是你的评论还是回答?我想你误解了我在这里提出的全部观点。这只是一个评论。您的答案很好。添加一个存根来定义旧名称以允许旧libs(否则应该可以与任何编译器版本一起工作)工作怎么样?我在一个公共库中遇到了这个问题,它需要继续与旧的VS版本一起工作。我用if-MSC-VER包装了令人不快的define-sprintf