VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突

Posted

技术标签:

【中文标题】VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突【英文标题】:VS2017 #error: : Macro definition of snprintf conflicts with Standard Library function declaration 【发布时间】:2018-09-05 07:19:28 【问题描述】:

我正在尝试使用 VS2017 构建在 VS 2010 中开发的应用程序。当我构建应用程序时,我收到以下错误:

error: : snprintf 的宏定义与标准库函数声明冲突

我尝试像here 一样解决这个问题。但在我的情况下它不起作用。

我正在使用带有 VS2017 社区 15.8.2 的 Windows 10。

【问题讨论】:

你的代码中是否有这样的定义:#define snprintf? 错误告诉你到底哪里出了问题。在您的代码中的某处,您有 snprintf 的宏定义。您需要找到该定义并将其删除或重命名。如果您在代码中的任何位置使用该定义,则需要验证宏定义是否与标准库函数兼容。如果没有,那么您需要根据需要重写代码。不要指望灵丹妙药解决方案,您必须了解您正在使用的代码并以适合您的代码的方式解决问题。 是的,你是对的。很抱歉给您带来不便,非常感谢! 很高兴您提出这个问题。谢谢。 【参考方案1】:

正如您问题中的错误所示,您的 snprintf 的宏定义不再与您当前的版本兼容。

所以你需要寻找以下内容:

#define snprintf _snprintf

您可以删除它,或者如果您还需要使用 Visual Studio 2010 编译您的代码,您可以添加以下条件:

#if _MSC_VER < 1700 
#define snprintf _snprintf
#endif

【讨论】:

【参考方案2】:

错误消息应该有助于告诉您哪个文件包含有问题的#define。就我而言,这是错误的。 CMAKE 正在添加一个标题(在我的例子中是 my_config.h),它没有通过跟踪错误代码直接显示。对 #define snprintf _snprintf 进行解决方案范围内的搜索,结果为零。

我如何发现有问题的#define:

尝试构建。

获取错误信息:#error: snprintf 的宏定义与标准库函数声明冲突(编译源文件 D:\PathToFile\libmysql.c)。 libmysql.c 没有这样的定义,它包含的任何头文件也没有。

双击错误消息。这将在新选项卡中打开 stdio.h,在生成错误的行(在我的例子中为第 1914 行)。

1906 #if defined snprintf
1907     // This definition of snprintf will generate "warning C4005: 'snprintf': macro
1908     // redefinition" with a subsequent line indicating where the previous definition
1909     // of snprintf was.  This makes it easier to find where snprintf was defined.
1910     #pragma warning(push, 1)
1911     #pragma warning(1: 4005) // macro redefinition
1912     #define snprintf Do not define snprintf as a macro
1913     #pragma warning(pop)
1914     #error Macro definition of snprintf conflicts with Standard Library function declaration
1915 #endif

将鼠标悬停在检查定义的单词 snprintf 上(在我的例子中是第 1906 行)。 Intellisense 将向您显示 |>| #define snprintf _snprintf 在工具提示中。

右键单击单词 snprintf(不是工具提示),然后单击 Peek DefinitionGo To Definition。这会弹出有问题的#define,您现在可以根据需要删除或修改它。

493 #define ssize_t SSIZE_T
494 #define strcasecmp _stricmp
495 #define strncasecmp _strnicmp
496 #define snprintf _snprintf // <-- Offending line.
497 #define strtok_r strtok_s
498 #define strtoll _strtoi64
499 #define strtoull _strtoui64

就我而言,违规行是 496,我只是删除了它。

返回 stdio.h 并将鼠标悬停在 snprintf 单词上,它不应再为您提供工具提示,因为它未定义(我的也从紫色变为白色)。

【讨论】:

以上是关于VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突的主要内容,如果未能解决你的问题,请参考以下文章

vs2017,vs2019,无法解析的外部符号 sscanf,无法解析的外部符号 _snprintf,无法解析的外部符号 _vsnprintf,无法解析的外部符号 __iob_func

vs2017,vs2019,无法解析的外部符号 sscanf,无法解析的外部符号 _snprintf,无法解析的外部符号 _vsnprintf,无法解析的外部符号 __iob_func

vs2017,vs2019,无法解析的外部符号 sscanf,无法解析的外部符号 _snprintf,无法解析的外部符号 _vsnprintf,无法解析的外部符号 __iob_func

_sntprintf_s 和 _sntprintf 区别

VS2017git 提交提示错误 Git failed with a fatal error.

VS 2017 Git failed with a fatal error的解决办法