[英]Is there a standard definition for __cplusplus in c++14?
我正在寻找设置一些预处理器的东西,我想要一个更准确的数字来说明 C++14 中的__cplusplus
应该被定义为什么。 标准中是否有强制要求?
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)
202002L
(C++20)
在最终标准发布之前,任何给定版本的宏的价值都不会牢固确立。 因此,截至 2019 年 6 月,无法知道 C++2a 的宏值是多少(截至 2021 年 2 月,无法知道 C++2b 的值是多少)。
库供应商通常栅极他们的“C ++ 2A”功能上#if __cplusplus > 201703L
,并在他们的“C ++ 2B”设有__cplusplus > 202002L
,等等。
具有“C++2a”模式的编译器供应商只需为__cplusplus
选择任意值,使库供应商的检查满意:
GCC (8.x 到 10.x) -std=c++2a
模式使用__cplusplus == 201709L
。
Clang (5.x 到 9.x) -std=c++2a
模式使用__cplusplus == 201707L
。
Microsoft Visual Studio(19.20 至 19.28) /std:c++latest
模式使用__cplusplus == 201705L
当且仅当您通过/Zc:__cplusplus
! 否则它使用199711L
。 所以要注意这一点!
历史上如何处理转换?:
Clang 4.0.1 -std=c++1z
设置__cplusplus == 201406L
。 Clang 5.0.0 引入了-std=c++17
和-std=c++2a
,使-std=c++1z
成为-std=c++17
的同义词,并撞上了宏(无论17
/ 1z
您使用)到标准值201703L
。 Clang 10.0 引入了-std=c++20
,使-std=c++2a
成为-std=c++20
的同义词,并将宏提升到标准值202002L
。 截至 2021 年 2 月,Clang 没有正式的“C++2b”模式。
GCC 5.1 引入了-std=c++1z
和-std=c++17
作为同义词,设置__cplusplus == 201500L
。 GCC 7.1 将该值(无论您使用哪种拼写)提高到201703L
的标准值。 GCC 8.1 引入了-std=c++2a
和__cplusplus == 201709L
。 GCC 10.1 引入-std=c++20
作为-std=c++2a
的同义词(但将宏保留在201709L
)。 截至 2021 年 2 月,GCC 主干引入了-std=c++2b
和__cplusplus == 202100L
。
奇怪的是,根据 Godbolt Compiler Explorer 的说法,MSVC 在 MSVC 19.16 和 19.20 之间的201704L
将-std:c++latest
模式的宏从201704L
到201705L
。 截至 2021 年 2 月,据我所知,MSVC 没有正式的“C++20”模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.