我希望设置一些预处理程序的东西,而且我想要一个更准确的数字来定义C ++ 14中的__cplusplus
。是否有一个标准强制要求?
答案 0 :(得分:43)
N3936 * §16.8[cpp.predefined] / p1:
1以下宏名称应由实现定义:
__cplusplus
名称
__cplusplus
定义为值201402L
时 编译C ++翻译单元。
N3936是最终的工作草案,成为C ++ 14,数字201402L
与发送C ++ 14标准进行最终投票的会议一致(February 2014)
* 有兴趣获取C ++标准副本的人应该查看Where do I find the current C or C++ standard documents?
答案 1 :(得分:1)
cppreference在“ Predefined macros”部分中提供了有关__cplusplus
宏的标准值的信息。当前的标准值为:
199711L
(C ++ 98或C ++ 03)
201103L
(C ++ 11)
201402L
(C ++ 14)
201703L
(C ++ 17)
仅供参考,在最终标准发布之前,任何给定版本的宏的值都无法确定。因此,截至2019年6月,尚无办法知道C ++ 2a的宏值是什么。
图书馆供应商通常会在#if __cplusplus > 201703L
上使用其“ C ++ 2a”功能。
使用“ 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
。
令人困惑的是,即使在__cplusplus == 199711L
模式下,Microsoft Visual Studio也总是设置/std:c++17
,unless you enable /Zc:__cplusplus
.,所以要当心!