与问题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应该是什么?
答案 0 :(得分:30)
现在还为时过早。
在标准替换之前,请使用:
#if __cplusplus > 201703L
// C++20 code
#endif
因为C ++ 20的预定义宏将大于C ++ 17的宏。
@SombreroChicken的答案中提到,[cpp.predefined] (1.1)指定(强调我的意思):
__cplusplus
整数文字
201703L
。 [注意:预期是该国际标准的未来版本将替换该值 更大值的宏。]
截至2018年11月使用的宏为:
201709L
。 Live demo 201707L
。 Live demo 201704L
(如@Acorn的答案所述)。PS:如果您对特定功能感兴趣,那么[cpp.predefined] (1.8)定义相应的宏,您可以使用它们。但是请注意,它们将来可能会更改。
答案 1 :(得分:10)
新值有时会在[cpp.predefined]p1.1上可用:
__cplusplus
整数文字
201703L
。 [注意:本国际标准的将来版本将用更大的值替换此宏的值。 —尾注]
截止2018年11月30日,主要编译器中使用的当前值为:
201709L
godbolt 201707L
godbolt 201704L
godbolt(需要/Zc:__cplusplus
)由于所有参数都已经高于C ++ 17的201703L
,因此您可以使用:
#if __cplusplus > 201703L
// C++20 code
#endif
答案 2 :(得分:5)
尚无已知的__cplusplus
版本,因为C ++ 20仍在开发中。只有C ++ 20的草稿。
latest draft N4788仍然包含:
__cplusplus
整数文字
201703L
。 [注:本国际标准的未来版本将取代该值。 具有更大价值的宏。 —尾注]
至于检查,我将使用@gsamaras答案。