2017-04-26 38 views
2

我正在尝试使用Microsoft Visual C++编译器(以前的GCC和其他编译器)编译多平台C++项目。使用_MSVC_LANG而不是__cplusplus安全吗?

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

#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的程度?

+3

检查* *也,不*代替*(逻辑或)。 –

+0

好的,我编辑了它。 – WolfgangS

回答

1

首先,如果你想有一个便携式的解决方法,你可以这样做:

#if __cplusplus < 201103L && _MSVC_LANG < 201103L 
/* ... */ 
#elif __cplusplus >= 201402L || _MSVC_LANG >= 201402L 

你链接的评论指出,它是__cplusplus设置不正确的错误和测试_MSVC_LANG是一个权宜之计。但是,VC 2017(19.10.25017)与/std:c++14仍然将__cplusplus设置为199711。我不确定这是否意味着C++ 14的支持仍然不完全,或者他们从来没有接触过。

_MSVC_LANG宏是Microsoft扩展。大多数其他编译器不会设置它,以便更容易地测试编译器是否为Microsoft。 (一个例外:clang++ --std:c++14 -fms-compatibility-version=19.10同时设置__cplusplus_MSVC_LANG201402L,因为这是它的MSVC兼容模式)。

相关问题