__cplusplus对C ++ 17的价值是多少?

时间:2016-07-19 10:37:51

标签: c++ macros c++17

我们正在尝试在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的值是多少?

6 个答案:

答案 0 :(得分:31)

  

使用C ++ 17时__cplusplus的值是多少?

根据标准草案N4594 §16.8/ p1预定义的宏名称[cpp.predefined] Emphasis Mine ):

  

以下宏名称应由实现定义:   __cplusplus名称__cplusplus已定义为值   编译C ++翻译单元时 201402L 156

     

156)本标准的未来版本将是   用更大的值替换此宏的值。不合格   编译器应使用最多五位小数的值。

但是,为C ++ 14标准指定了相同的值。显然似乎是这样,C ++ 17标准尚未设置官方/标准__cplusplus值。

在GCC版本6.1和7.0中,值更改为 201500

Live Demo

在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.");