场景复现
我在VS2022偶然的一次测试C++标准开发环境,发现无论我怎么修改C++语言标准,输出的__cplusplus
宏总是199711
。
Visual Studio官方说明
链接:https://learn.microsoft.com/zh-cn/cpp/build/reference/zc-cplusplus?view=msvc-170&viewFallbackFrom=vs-2022
注解
__cplusplus 预处理器宏通常用于报告 C++ 标准特定版本的支持。因为很多现有代码需要此宏的值与 199711L 匹配,所以编译器不会更改此宏的值,除非通过使用 /Zc:__cplusplus 编译器选项进行显式选择。 从 Visual Studio 2017 版本 15.7 开始便已提供 /Zc:__cplusplus 选项,该选项在默认情况下处于禁用状态。 在早期版本的 Visual Studio 中,在默认情况下或者在指定了 /Zc:__cplusplus- 的情况下,Visual Studio 针对 199711L 预处理器宏返回值 __cplusplus。 /permissive- 选项不启用 /Zc:__cplusplus。
启用 /Zc:__cplusplus 选项后,__cplusplus 宏报告的值取决于 /std 版本选项设置。 下表列出了该宏的可能值:
/Zc:__cplusplus 选项 /std 选项 __cplusplus 值
Zc:__cplusplus /std:c++14(默认值) 201402L
Zc:__cplusplus /std:c++17 201703L
Zc:__cplusplus /std:c++20 202002L
Zc:__cplusplus /std:c++latest 查看文本
Zc:__cplusplus-(已禁用) 任何值 199711L
未指定 任何值 199711L
编译器不支持 C++98、C++03 或 C++11 的标准选项。 从 Visual Studio 2019 版本 16.11 开始,/std:c++20 选项可用。 /std:c++latest 选项的 __cplusplus 值取决于 Visual Studio 的版本。 它始终比 Visual Studio 版本支持的最高支持标准值 __cplusplus 至少高 1。
若要更精细地检测对编译器工具集的更改,请使用 _MSC_VER 预定义宏。 此内置宏的值会随 Visual Studio 2017 和更高版本中的每个工具集更新而增加。 _MSVC_LANG 预定义宏向标准版本报告 /Zc:__cplusplus 是启用还是禁用状态。 启用 /Zc:__cplusplus 后,__cplusplus 具有与 _MSVC_LANG 相同的值。
C++标准对应表
c++ | __cplusplus |
std::c++98 | 199711 |
std::c++11 | 201103 |
std:c++14 | 201402L/201300 |
std:c++17 | 201703L |
std:c++20 | 202002L |
解决方案
方法一 恢复__cplusplus宏
在 Visual Studio 中设置此编译器选项,打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”>“C/C++”>“命令行”属性页。将 /Zc:__cplusplus 或 /Zc:__cplusplus- 添加到“附加选项:”窗格中。。
方法二 使用_MSVC_LANG宏
我们只需要将之前的__cplusplus
宏替换为_MSVC_LANG
即可。