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

jww*_*jww 31 c++ macros c++17

我们正在尝试在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.156

156)本标准的未来版本将以更大的价值取代该宏的价值.不符合的编译器应使用最多五位小数的值.

但是,为C++ 14标准指定了相同的值.显然似乎是这样,__cplusplusC++ 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.

  • 啊,我错过了你的更新...我看到 GCC 7.3 的 `g++ -x c++ -std=c++14 -dM -E - &lt;/dev/null` 返回 `#define __cplusplus 201402L`。 (2认同)

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的实际值,也可以使用上述内容.有关不断发展的功能的更多详细信息,请尝试使用功能测试宏.


Tar*_*aro 7

通常你应该使用__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)


Jos*_*per 5

我意识到你问这个问题时引用了 Gnu C++ 编译器作为你正在使用的编译器,但你可能想了解 Visual C++ 编译器上发生的事情,严格来说,你的问题没有询问特定的编译器.

目前,截至本文发布之日,VC++ 2017 编译器设置为使用 c++17 __cplusplus199711L而不是您所期望的。

要使其正确报告,您还必须设置/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/