我正在设置一些预处理器的东西,我想要一个更准确的数字,因为__cplusplus
C++ 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++标准文档?
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
更改为到201705L
MSVC 19.16和19.20之间的某个时间。
归档时间: |
|
查看次数: |
16266 次 |
最近记录: |