我正在尝试使用 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
。 来自 Microsoft 博客的这篇文章 建议您也检查一下 _MSVC_LANG
。
_MSVC_LANG >= 201402L
在多大程度上不符合C++11?
首先,如果您想要一个便携式解决方法,您可以这样做:
#if __cplusplus < 201103L && _MSVC_LANG < 201103L
/* ... */
#elif __cplusplus >= 201402L || _MSVC_LANG >= 201402L
您链接的评论指出,这是一个错误,
__cplusplus
设置不正确,测试_MSVC_LANG
只是权宜之计。然而,带有 /std:c++14
的 VC 2017 (19.10.25017) 仍然将 __cplusplus
设置为 199711
。我不确定这是否意味着 C++14 支持尚未完全完成,或者他们只是从未抽出时间来实现。
_MSVC_LANG
宏是 Microsoft 扩展。大多数其他编译器不会设置它,以便更容易测试编译器是否是 Microsoft。 (一个例外:clang++ --std:c++14 -fms-compatibility-version=19.10
会将 __cplusplus
和 _MSVC_LANG
设置为 201402L
,因为这是其 MSVC 兼容模式。)
ETA: 感谢一位匿名评论者指出,有一个
/Zc:__cplusplus
编译器开关,它将__cplusplus
的值设置为与_MSVC_LANG
相同。如果没有此标志,MSVC 19 不会更改 __cplusplus
的版本,因为显然这破坏了现有代码。