我们正在尝试在C ++ 17及其change to 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
$
和
$ /opt/local/bin/g++ --version
g++-mp-6 (MacPorts gcc6 6.1.0_0) 6.1.0
Copyright (C) 2016 Free Software Foundation, Inc.
使用C ++ 17时__cplusplus
的值是多少?
答案 0 :(得分:31)
使用C ++ 17时
__cplusplus
的值是多少?
根据标准草案N4594 §16.8/ p1预定义的宏名称[cpp.predefined] ( Emphasis Mine ):
以下宏名称应由实现定义:
__cplusplus
名称__cplusplus
已定义为值 编译C ++翻译单元时 201402L 。 156156)本标准的未来版本将是 用更大的值替换此宏的值。不合格 编译器应使用最多五位小数的值。
但是,为C ++ 14标准指定了相同的值。显然似乎是这样,C ++ 17标准尚未设置官方/标准__cplusplus
值。
在GCC版本6.1和7.0中,值更改为 201500
在Clang版本3.8和3.9中,值保持不变 201406 。
因此,你必须等待标准值出来。
根据C ++标准§19.8/ p1预定义的宏名称[cpp.predefined] ( Emphasis Mine ):
1 以下宏名称应由 实现:
__cplusplus
整数字 201703L 。
因此,使用C ++ 17时__cplusplus
的值应为 201703L 。
答案 1 :(得分:11)
我会尝试
#if __cplusplus > 201402L
// C__17 code here
...
#endif
换句话说,测试大于C ++ 14应该可以在编译器添加更多功能时起作用。 如上所述,gcc使用201500L。看起来clang使用的是201406L(我估计在C ++ 14之后的四个月)。
使用上述内容应该是跨平台的,即使C ++ 17为__cplusplus提供了真正的值,它也能正常工作。有关不断发展的功能的更多详细信息,请尝试feature test macros。
答案 2 :(得分:3)
我真的不知道为什么__cplusplus
没有显示为常规宏,但我猜它是如此,你无法重新定义它。这就是我确定其价值的方式。
#include <iostream>
int main( int argc, char** argv )
{
std::cout << __cplusplus << std::endl;
return 0;
}
然后编译显示值。
$ g++-6 test.cpp && ./a.out
201402
$ g++-6 -std=c++17 test.cpp && ./a.out
201500
我会检查它是>= 201500
而不是检查任何特定值。
答案 3 :(得分:3)
通常,您应该使用__cplusplus
定义来检测c ++ 17,但是默认情况下,Microsoft编译器没有正确定义该宏,请参见https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/-您需要修改项目设置以包含{{ 1}}开关,或者您可以使用如下语法:
/Zc:__cplusplus
答案 4 :(得分:2)
我意识到您以使用Gnu C ++编译器为例提出了这个问题,但是您可能希望对Visual C ++编译器上发生的事情有所了解,严格来说,您的问题并没有特定的编译器。
当前,自发布之日起,VC ++ 2017编译器将__cplusplus
设置为199711L
,而不是将编译器设置为使用c ++ 17时的预期值。
要使其正确报告,您还必须设置/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/)
答案 5 :(得分:0)
现代编译时检查,您可以将其放入任何需要它的文件中:
static_assert(__cplusplus >= 201703L, "This file expects a C++17 compatible compiler.");