使用_MSVC_LANG而不是__cplusplus是否安全?

时间:2017-04-26 16:03:57

标签: c++11 visual-c++

我正在尝试使用Microsoft Visual C ++编译器编译多平台C ++项目(之前使用GCC,以及其他编译器)。

现在我遇到了一些像这样的预处理器指令:

#if __cplusplus < 201103L
    // Define some macros of C++11 the code really relies on.
    // [...]
#endif

虽然我使用Visual Studio 2015,但__cplusplus仍定义为199711LThis post from the Microsoft blog建议您同时查看_MSVC_LANG

_MSVC_LANG >= 201402L在多大程度上不符合C ++ 11?

1 个答案:

答案 0 :(得分:1)

首先,如果您需要便携式解决方法,可以执行以下操作:

#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兼容模式。)