如何检查 C++20 支持?对于 C++20,__cplusplus 的值是多少?

How do I check for C++20 support? What is the value of __cplusplus for C++20?

相关问题How do I check for C++11 support? and

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

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

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

太早了。

直到标准取代它,使用:

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

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

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

__cplusplus

The integer literal 201703L. [Note: It is intended that future versions of this International Standard will replace the value of this macro with a greater value.]


截至 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)定义了相应的宏,你可以使用。不过请注意,它们将来可能会发生变化。

尚无已知的 __cplusplus 版本,因为 C++20 仍在开发中。只有 C++20 的草稿。

latest draft N4788还包含:

__cplusplus

The integer literal 201703L. [Note: It is intended that future versions of this International Standard will replace the value of this macro with a greater value. —end note]

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

C++20 的值为 202002L,如您在 [cpp.predefined]p1.1:

中所见

_­_­cplusplus

The integer literal 202002L. [ Note: It is intended that future versions of this International Standard will replace the value of this macro with a greater value. — end note ]

因此,对于已经执行了新标准的编译器,您可以通过以下方式查看:

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

这是编译器目前支持的:

  • 叮当声 >= 10
  • 海湾合作委员会 >= 11
  • MSVC >= 19.29(需要 /Zc:__cplusplus
  • ICX >= 2021
  • ICC:否(版本 >= 2021 定义 202000L;注意 0