如何检查C ++ 20支持? __cplusplus对于C ++ 20的价值是什么?

时间:2018-11-30 12:30:02

标签: c++ macros c++20

与问题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应该是什么?

3 个答案:

答案 0 :(得分:30)

现在还为时过早。

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

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

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

@SombreroChicken的答案中提到,[cpp.predefined] (1.1)指定(强调我的意思):

  

__cplusplus

     

整数文字201703L。 [注意:预期是该国际标准的未来版本将替换该值   更大值的宏。]


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

  • GCC 9.0.0:对于C ++ 2a,201709LLive demo
  • C 8.0.0:201707LLive demo
  • VC ++ 15.9.3:201704L(如@Acorn的答案所述)。

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

答案 1 :(得分:10)

新值有时会在[cpp.predefined]p1.1上可用:

  

_­_­cplusplus

     

整数文字201703L。 [注意:本国际标准的将来版本将用更大的值替换此宏的值。 —尾注]

截止2018年11月30日,主要编译器中使用的当前值为:

由于所有参数都已经高于C ++ 17的201703L,因此您可以使用:

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

答案 2 :(得分:5)

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

latest draft N4788仍然包含:

  

__cplusplus

     

整数文字201703L。 [注:本国际标准的未来版本将取代该值。   具有更大价值的宏。 —尾注]

至于检查,我将使用@gsamaras答案。