Visual Studio 2019跨平台C++开发预编译指令编译时失效如何解决
跨平台C++代码VS编译报错C4996解决方案
核心原因
你遇到的问题本质是自定义平台判断宏没有在VS编译配置中全局生效:
Visual Studio不会默认定义WINDOWS_OS自定义宏,编辑器的灰显是你提前配置的自定义显示规则,但实际编译阶段项目没有全局定义WINDOWS_OS宏,预编译判断直接走了#else分支的Linux代码,才触发了Windows平台下fopen的废弃报错。
具体解决步骤
- 最优方案:替换为系统默认定义的标准平台宏,不需要自己维护自定义宏,从根源避免漏定义问题。Windows平台MSVC默认全局定义
_WIN32宏(32/64位Windows都会生效),Linux下GCC/Clang默认定义__linux__宏,修改预编译判断逻辑即可:
#ifdef _WIN32 errno_t success = fopen_s(&arq, logConfigFileName.str().c_str(), "rt"); #else arq = fopen(logConfigFileName.str().c_str(), "rt"); #endif
- 若要继续使用自定义
WINDOWS_OS宏:打开VS项目属性 -> C/C++ -> 预处理器 -> 预处理器定义,添加WINDOWS_OS,注意要将配置范围选为「所有配置」、平台选为「所有平台」,避免只对当前Debug x86生效。 - 兜底方案:如果你确认逻辑没问题,也可以在预处理器定义中添加
_CRT_SECURE_NO_WARNINGS,直接关闭C4996类的安全函数告警,不过更推荐优先用前两个方案从逻辑层面解决分支走偏问题。
验证方法
可以在代码中添加编译日志确认分支是否生效:
#ifdef _WIN32 #pragma message("正在编译Windows平台分支") #else #pragma message("正在编译非Windows平台分支") #endif
编译时查看输出窗口的日志,即可确认当前走的分支是否符合预期,避免编辑器显示和实际编译逻辑不一致。
内容的提问来源于stack exchange,提问作者Alexandre Trindade
相关产品推荐
相关产品推荐

