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

use*_*653 29 c++ macros c++20

与问题相关如何检查C++ 11支持?什么是__cplusplus对C++ 17的价值?

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

#if __cplusplus > ???
  // C++20 code here
#endif
Run Code Online (Sandbox Code Playgroud)

什么应该???是C++ 20?

gsa*_*ras 35

现在为时尚早.

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

#if __cplusplus > 201703L
  // C++20 code
#endif
Run Code Online (Sandbox Code Playgroud)

因为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 : 201707L. Live demo
  • VC++ 15.9.3 :( 201704L如@ Acorn的回答提到).

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

  • gcc 8.2使用`201709`表示`c ++ 2a`而clang 7.0使用`201707` (5认同)

Aco*_*orn 11

新值将在[cpp.predefined] p1.1的某个时刻提供:

_­_­cplusplus

整数文字201703L.[注意:本国际标准的未来版本将以更大的价值取代此宏的价值. - 结束说明]

主要编制者使用的当前值是截至2018-11-30:

由于它们都已经高于C++ 17 201703L,你已经可以使用:

#if __cplusplus > 201703L
    // C++20 code
#endif
Run Code Online (Sandbox Code Playgroud)


Som*_*ken 6

目前尚无已知__cplusplus版本,因为C++ 20仍处于开发阶段.只有C++ 20的草稿.

最新的N4788草案仍包含:

__cplusplus

整数文字201703L.[注意:本国际标准的未来版本将以更大的价值取代此宏的价值. - 尾注]

至于检查它,我会使用@gsamaras的答案.