我们正在尝试在C++ 17下测试一些代码并将其更改为std::uncaught_exception
.我似乎无法让GCC提供以下价值__cplusplus
:
$ /opt/local/bin/g++ -std=c++17 -dM -E - </dev/null | grep __cplusplus
cc1: warning: command line option '-std=c++1z' is valid for C++/ObjC++ but not for C
$
Run Code Online (Sandbox Code Playgroud)
和:
$ /opt/local/bin/g++ --version
g++-mp-6 (MacPorts gcc6 6.1.0_0) 6.1.0
Copyright (C) 2016 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)
__cplusplus
使用C++ 17时有什么价值?
101*_*010 37
__cplusplus
使用C++ 17时有什么价值?
根据标准草案 N4594§16.8/ p1预定义的宏名称[cpp.predefined](Emphasis Mine):
以下宏名称应由实现定义: 在编译C++转换单元时
__cplusplus
,名称__cplusplus
定义为值 201402L.156156)本标准的未来版本将以更大的价值取代该宏的价值.不符合的编译器应使用最多五位小数的值.
但是,为C++ 14标准指定了相同的值.显然似乎是这样,__cplusplus
C++ 17标准还没有官方/标准值集.
在GCC版本6.1和7.0中,值更改为201500
在Clang版本3.8和3.9中,该值在201406中保持不变.
因此,您需要等待一点标准值才能出来.
根据C++标准§19.8/ p1预定义的宏名称[cpp.predefined](Emphasis Mine):
1以下宏名称应由实施定义:
__cplusplus
整数字面积201703L.
因此,__cplusplus
使用C++ 17时的值应为201703L.
ems*_*msr 13
我会尝试
#if __cplusplus > 201402L
// C__17 code here
...
#endif
Run Code Online (Sandbox Code Playgroud)
换句话说,测试大于C++ 14应该可以在编译器添加更多功能时起作用.如上所述,gcc使用201500L.看起来clang使用的是201406L(我估计在C++ 14之后的四个月).
使用上述内容应该是跨平台的,即使C++ 17具有__cplusplus的实际值,也可以使用上述内容.有关不断发展的功能的更多详细信息,请尝试使用功能测试宏.
通常你应该使用__cplusplus
定义来检测 c++17,但默认情况下微软编译器没有正确定义该宏,请参阅https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ - 你需要修改项目设置以包含/Zc:__cplusplus
开关,或者您可以使用如下语法:
#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
//C++17 specific stuff here
#endif
Run Code Online (Sandbox Code Playgroud)
我意识到你问这个问题时引用了 Gnu C++ 编译器作为你正在使用的编译器,但你可能想了解 Visual C++ 编译器上发生的事情,严格来说,你的问题没有询问特定的编译器.
目前,截至本文发布之日,VC++ 2017 编译器设置为使用 c++17 __cplusplus
,199711L
而不是您所期望的。
要使其正确报告,您还必须设置/Zc:__cplusplus
.
(来源:https : //docs.microsoft.com/en-us/cpp/build/reference/zc-cplusplus?view=vs-2017)
至于为什么?嗯……用他们的话来说:
我们尝试默认更新宏,发现当我们更改 __cplusplus 的值时,很多代码无法正确编译。
(来源:https : //devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/)