c ++ 14中是否有__cplusplus的标准定义?

Mic*_*nda 41 c++ c++14

我正在设置一些预处理器的东西,我想要一个更准确的数字,因为__cplusplusC++ 14应该被定义为.是否有一个标准强制要求?

T.C*_*.C. 46

N3936 * §16.8[cpp.predefined]/p1:

1以下宏名称应由实施定义:

__cplusplus

在编译C++转换单元时,名称__cplusplus定义为该值201402L.

N3936是最终的工作草案,成为C++ 14,这个数字201402L与C++ 14标准发送进行最终投票的会议一致(2014年2月).

*有兴趣获得C++标准副本的人应该查看我在哪里可以找到当前的C或C++标准文档?


Quu*_*one 9

cppreference __cplusplus在“ 预定义的宏 ” 部分中提供了有关宏标准值的信息。当前的标准值为:

199711L(C ++ 98或C ++ 03)
201103L(C ++ 11)
201402L(C ++ 14)
201703L(C ++ 17)

仅供参考,在最终标准发布之前,任何给定版本的宏的值都无法确定。因此,截至2019年6月,尚无办法知道C ++ 2a的宏值是多少。

库供应商通常会在上选择其“ C ++ 2a”功能#if __cplusplus > 201703L

具有“ C ++ 2a”模式的编译器供应商只需选择任何__cplusplus使库供应商的__cplusplus > 201703L检查满意的任意值即可:

GCC(8.x,9.x和中继)-std=c++2a模式集__cplusplus == 201709L
lang(5.x,6.x,7.x,8.x和躯干)-std=c++2a模式集__cplusplus == 201707L
Microsoft Visual Studio(19.20)/std:c++latest模式设置为__cplusplus == 201705L 当且仅当您通过/Zc:__cplusplus!否则使用199711L。所以要当心!

历史上如何处理过渡?:

铛4.0.1 -std=c++1z设置__cplusplus == 201406L。引入-std=c++17了Clang 5.0.0 ,使其-std=c++1z成为同义词-std=c++17,并将宏(无论使用的是17/ 1z)提高到的标准值201703L

引入GCC 5.1 -std=c++1z-std=c++17作为同义词进行设置__cplusplus == 201500L。在GCC 6.4和GCC 7.1之间,该宏被提升为的标准值(无论您使用哪种拼写)201703L

奇怪的是,根据Godbolt Compiler Explorer的说法,MSVC将宏的-std:c++latest模式从201704L更改为到201705LMSVC 19.16和19.20之间的某个时间。