C 17 的 __cplusplus 值是多少?

新手上路,请多包涵

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

和:

 $ /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 的值是多少?

原文由 jww 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

tl; dr:对于 C++17, __cplusplus201703L

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

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

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

  1. 本标准的未来版本打算用更大的值替换此宏的值。不符合标准的编译器应使用最多五个十进制数字的值。

但是,为 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

原文由 101010 发布,翻译遵循 CC BY-SA 4.0 许可协议

通常您应该使用 __cplusplus 定义来检测 c++17,但默认情况下,微软编译器没有正确定义该宏,请参阅 https://devblogs.microsoft.com/cppblog/msvc-now-correctly-报告-__cplusplus/ - 您需要修改项目设置以包含 /Zc:__cplusplus 开关,或者您可以使用如下语法:

 #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
     //C++17 specific stuff here
#endif

原文由 TarmoPikaro 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题