MSVC编译器对 __cplusplus
在Visual Studio 2017版本15.7 Preview 3中,预定义宏提前了20年。此宏一直保持在“199711L”的值,这表示(错误!)编译器符合C++ 98标准。既然 我们的补习工作快结束了 我们正在更新 __cplusplus
宏观来反映我们执行的真实状态。价值 __cplusplus
宏并不意味着我们不再有任何一致性错误。只是新值比总是报告“199711L”要准确得多。
/Zc:uuu cplusplus公司
您需要使用 /Zc:__cplusplus
切换以查看 __cplusplus
宏。我们尝试在默认情况下更新宏,发现在更改 __cplusplus
. 我们将继续要求使用 /Zc:__cplusplus
切换19.xx系列中所有次要版本的MSVC。
报告的版本 __cplusplus
宏还取决于使用的标准版本开关。如果你正在编译C++ 14模式,宏将被设置为“201402L”。如果你用C++ 17模式编译,宏将被设置为“201703L”。以及 这个 /std:c++latest
转换 ,用于启用当前正在开发的标准中的功能,设置一个大于当前标准的值。此图表显示 __cplusplus
具有不同开关组合的宏:
/Zc:uuu cplusplus开关 | /std:c++ 转换 | __cplusplus值 |
---|---|---|
Zc:__cplusplus |
当前默认为C++ 14 | 201402L公司 |
Zc:__cplusplus |
/std:c++14 |
201402L公司 |
Zc:__cplusplus |
/std:c++17 |
201703L型 |
Zc:__cplusplus |
/std:c++latest |
201704L型 |
Zc:__cplusplus- (已禁用) |
任何价值 | 199711升 |
Zc:__cplusplus 未指定 |
任何价值 | 199711升 |
注意,MSVC编译器不支持,也永远不会支持C++ 11、C++ 03或C++ 98标准版本切换。还有 __cplusplus
宏不受 /permissive-开关 .
我们正在更新IntelliSense以正确反映 __cplusplus
用MSVC编译时。我们希望IntelliSense在15.7的下一个预览版中是正确的。
_理学硕士
为了更细粒度地检测MSVC工具集中的更改,您可以 继续使用 _MSC_VER
预定义宏 . 我们已经在Visual Studio 2017中的每个工具集更新中更新了此内置宏的值,并将继续这样做。
这个 _MSVC_LANG
预定义宏 继续报告标准版本切换,而不考虑 /Zc:__cplusplus
. _MSVC_LANG
是否设置 /Zc:__cplusplus
选项已启用。什么时候? /Zc:__cplusplus
已启用, __cplusplus == _MSVC_LANG
.
请在代码中查找用法
我们已经多次听到开发商的消息 当我们接近完全一致性时,我们需要更新这个宏的值。现在我们需要你的帮助。我们试图定义 __cplusplus
默认情况下是正确的,但发现许多代码希望MSVC总是将宏设置为“199711L”。
请花点时间搜索您的代码以查找 __cplusplus
并用 /Zc:__cplusplus
开关已启用。您的代码可能正在使用此宏来确定它是用MSVC编译还是在MSVC仿真模式下使用Clang编译。如果你的代码库真的很旧,它可能会使用这个宏来确定你是否在使用VC++6.0!在启用此开关的情况下花点时间编译。我们需要生态系统向前发展 __cplusplus
默认情况下准确。
最后
一如既往,我们欢迎您的反馈。我们可以通过下面的评论或电子邮件联系我们( visualcpp@microsoft.com ).
如果您在Visual Studio 2017中遇到MSVC的其他问题,请联系我们 帮助>报告产品中的问题 ,或通过 开发者社区 . 把你的建议告诉我们 用户语音 . 你也可以在Twitter上找到我们( @视觉 )还有Facebook( msftvisualcpp软件 ).