C++ 如何检查C++;20人支持?对于C+,uu cplusplus的值是多少+;20?
与问题和 如何查询编译器是否可以处理/设置为使用C++20?我知道,原则上,可以通过以下方式查询C++版本: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的回答所提到的,指
#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:
适用于C++2a李>201709L
- Clang 8.0.0:
李>201707L
- VC++15.9.3:
(正如@Acorn的回答所提到的)201704L
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功能…