【问题标题】:How do I check for C++20 support? What is the value of __cplusplus for C++20? [duplicate]如何检查 C++20 支持? __cplusplus 对于 C++20 的值是多少? [复制]
【发布时间】:2019-05-02 14:46:58
【问题描述】:

与问题How do I check for C++11 support?What is the value of __cplusplus for C++17?相关

如何查询编译器是否可以处理/设置为使用C++20?我知道原则上可以通过以下方式查询 C++ 版本:

#if __cplusplus > ???
  // C++20 code here
#endif

对于 C++20,??? 应该是什么?

【问题讨论】:

  • 测试大于 2017 不起作用?
  • @AntoineMorrier 当然!为什么我没有想到呢?无论 C++20 的值是多少,都将大于 17 的值。
  • 在大多数情况下,更愿意测试您需要的features,而不是语言版本。

标签: c++ macros c++20


【解决方案1】:

现在还为时过早。

在标准取代它之前,使用:

#if __cplusplus > 201703L
  // C++20 code
#endif

因为 C++20 的预定义宏将大于 C++17 的宏。

正如@SombreroChicken 的回答所提到的,[cpp.predefined] (1.1) 指定(强调我的):

__cplusplus

整数文字201703L。 [注意:有意本国际标准的未来版本将替换值 这个宏的值更大。]


截至 2018 年 11 月,使用的宏是:

  • GCC 9.0.0:201709L 用于 C++2a。 Live demo
  • Clang 8.0.0:201707LLive demo
  • VC++ 15.9.3:201704L(正如@Acorn 的回答所述)。

PS:如果您对特定功能感兴趣,那么[cpp.predefined] (1.8) 定义了相应的宏,您可以使用它。但请注意,它们将来可能会发生变化。

【讨论】:

  • gcc 8.2 将201709 用于c++2a,而clang 7.0 使用201707
  • GCC 9 和 Clang 8 @bolov 相同,更新了我的答案,谢谢!
  • 在您已经获得接受和投票最多的答案后复制其他答案并不好:-)
  • 是的,我同意@Acorn。但是,请注意有些人是如何同时改进他们的答案的。我看到我们的答案有很多共同点,就像你对 Sombrero Chicken 的回答一样。如果您认为,我应该修改我的答案以提高未来用户从阅读本文中获得的收益,然后告诉我。无论如何,如果您认为应该接受您的,那么没问题,您的回答非常好:) 另外让我们稍后清理这些,为了未来的用户。
【解决方案2】:

C++20 的值为202002L,您可以在[cpp.predefined]p1.1 看到:

_­_­cplusplus

整数文字202002L。 [ 注意:本国际标准的未来版本打算用更大的值替换此宏的值。 — 尾注 ]

因此,对于已经实现新标准的编译器,可以通过以下方式进行检查:

#if __cplusplus >= 202002L
    // C++20 (and later) code
#endif

这是目前为止的编译器支持:

  • 叮当 >= 10
  • GCC >= 11
  • MSVC >= 19.29(需要/Zc:__cplusplus
  • ICX >= 2021
  • ICC:否(版本 >= 2021 定义 202000L;请注意 0

【讨论】:

  • 您确定要 >= 进行 202002 年的测试吗?希望 C++23 不会破坏 大多数 C++20 特性……
  • > 201703L 是不够的。例如 GCC 8 使用 201709 并且它是部分 C++2a 支持。
  • @ViníciusFerrão 我会澄清的。编辑:我把它完全删除了,已经是 2021 年了……
  • @Acorn 谢谢! ?
  • @ViníciusFerrão np!
【解决方案3】:

目前还没有已知的__cplusplus 版本,因为 C++20 仍在开发中。只有 C++20 的草稿。

latest draft N4788 仍然包含:

__cplusplus

整数文字201703L。 [注:本国际标准的未来版本将取代价值 这个宏的值更大。 ——尾注]

至于检查,我会使用@gsamaras 回答。

【讨论】:

  • @gsamaras 只是因为你问得很好
猜你喜欢
  • 2020-12-20
  • 2016-11-22
  • 2020-12-22
  • 2022-01-07
  • 1970-01-01
  • 2023-03-05
  • 2020-08-17
  • 1970-01-01
  • 2021-10-03
相关资源
最近更新 更多