C++ 如何检查C++;20人支持?对于C+,uu cplusplus的值是多少+;20?

C++ 如何检查C++;20人支持?对于C+,uu cplusplus的值是多少+;20?,c++,macros,c++20,C++,Macros,C++20,与问题和 如何查询编译器是否可以处理/设置为使用C++20?我知道,原则上,可以通过以下方式查询C++版本: #if __cplusplus > ??? // C++20 code here #endif C++20的?应该是什么?现在说还为时过早 在标准替代之前,请使用: #if __cplusplus > 201703L // C++20 code #endif 因为C++20的预定义宏将大于C++17的预定义宏 正如@SombreroChicken的回答所提到的,指

与问题和

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

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

C++20的
应该是什么?

现在说还为时过早

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

#if __cplusplus > 201703L
  // C++20 code
#endif
因为C++20的预定义宏将大于C++17的预定义宏

正如@SombreroChicken的回答所提到的,指定(强调我的):

\uu cplusplus

整数文本
201703L
。[注:本国际标准的未来版本将取代该值 此宏的值大于值。]


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

  • GCC 9.0.0:
    201709L
    适用于C++2a
  • Clang 8.0.0:
    201707L
  • VC++15.9.3:
    201704L
    (正如@Acorn的回答所提到的)


PS:如果您对特定功能感兴趣,那么可以定义相应的宏,您可以使用这些宏。但是请注意,它们在将来可能会发生变化。

由于C++20仍在开发中,目前还没有已知的
\uucplusplus
版本。只有C++20的草稿

仍然包括:

\uu cplusplus

整数文本
201703L
。[注:本国际标准的未来版本将取代该值 此宏的值更大。-结束注释]


至于检查它,我将使用@gsamaras answer。

C++20的值是
202002L
,如您所见:

\u­-cplusplus

整数文本
202002L
。[注:本国际标准的未来版本将用更大的值替换该宏的值。-结束注]

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

#if __cplusplus >= 202002L
    // C++20 (and later) code
#endif
这是迄今为止的编译器支持:

  • 叮当声=10
  • GCC=11
  • ICX>=2021年
  • ICC:否(版本>=2021定义了
    202000L
    ;请注意
    0
  • MSVC:否(从19.28版开始,请注意它将需要)
对于那些尚未实施的项目,您可以改为使用:

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

因为所有编译器在各自的“C++最新版本”模式下都定义它已经高于C++17的
201703L

大于2017的测试不起作用?@AntoineMorrier当然!为什么我没想到呢?无论C++20的值是什么,都将大于17的值。在大多数情况下,您更愿意测试所需的语言版本,而不是语言版本。@JerryCoffin,即使这是重复的,当链接的问题有你的答案时,用金牌特权来结束这个问题似乎有点偏颇…@Acorn:考虑到我一直这么做的时间,我已经发布了很多问题的原始答案。大多数其他金质徽章持有者也不可避免地会遇到同样的情况,因此,这一点似乎值得怀疑。gcc 8.2使用
201709
表示
c++2a
和clang 7.0使用
201707
表示gcc 9和clang 8@bolov,更新了我的答案,谢谢!在你已经有了被接受的、得票最高的答案之后再抄袭其他答案是不好的:-)是的,我同意@Acorn。然而,请注意一些人是如何同时改进他们的答案的。我发现我们的答案有很多共同点,就像你的回答一样。如果你认为,我应该修改我的答案,以提高未来用户从阅读本文中获得的收益,然后让我知道。在任何情况下,如果你认为你的答案应该被接受,那么没问题,你的答案很好:)为了未来的用户,让我们稍后再清理这些内容。@gsamaras,因为你问得很好,你想要202002测试的
=
?希望C++23不会破坏大多数C++20功能…