You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:27:05