我正在尝试使用 Microsoft Visual C++ 编译器(以前使用 GCC 以及其他编译器)编译多平台 C++ 项目。
现在我遇到了一些像这样的预处理器指令:
#if __cplusplus < 201103L
// Define some macros of C++11 the code really relies on.
// [...]
#endif
虽然我使用的是Visual Studio 2015,__cplusplus
仍然定义为199711L
. 这篇文章来自微软博客 https://blogs.msdn.microsoft.com/vcblog/2016/06/07/standards-version-switches-in-the-compiler/建议还检查一下_MSVC_LANG
.
到什么程度_MSVC_LANG >= 201402L
不符合C++11?
首先,如果您想要一个便携式解决方法,您可以执行以下操作:
#if __cplusplus < 201103L && _MSVC_LANG < 201103L
/* ... */
#elif __cplusplus >= 201402L || _MSVC_LANG >= 201402L
您链接的评论指出这是一个错误__cplusplus
设置不正确并且测试_MSVC_LANG
是权宜之计。然而,VC 2017 (19.10.25017)/std:c++14
仍然设置__cplusplus
to 199711
。我不确定这是否意味着 C++14 支持尚未完全完成,或者他们只是从未抽出时间来支持它。
The _MSVC_LANG
宏是 Microsoft 的扩展。大多数其他编译器不会设置它,以便更容易测试编译器是否是 Microsoft。 (一个例外:clang++ --std:c++14 -fms-compatibility-version=19.10
将同时设置__cplusplus
and _MSVC_LANG
to 201402L
,因为这是它的 MSVC 兼容模式。)
ETA:感谢一位匿名评论者指出,有一个/Zc:__cplusplus
编译器开关,它设置的值__cplusplus
以匹配您选择的变体。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)