繁体   English   中英

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

[英]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模式的宏从201704L201705L 截至 2021 年 2 月,据我所知,MSVC 没有正式的“C++20”模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM