web-dev-qa-db-ja.com

C ++ 20のサポートを確認するにはどうすればよいですか? C ++ 20の__cplusplusの価値は何ですか?

質問に関連する C++ 11サポートの確認方法 および C++ 17の__cplusplusの値は?

コンパイラがC++ 20を使用するように設定されているかどうかを調べるにはどうすればよいですか?原則として、次の方法でC++バージョンを照会できることがわかっています。

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

どうしたら良い ??? C++ 20向けですか?

27
user2296653

それには早すぎます。

標準に置き換えられるまで、次を使用します。

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

c ++ 20の定義済みマクロはC++ 17のマクロよりも大きくなるためです。

@SombreroChickenの答えが言及しているように、 [cpp.predefined](1.1) は(emphasis mine)を指定します:

__cplusplus

整数リテラル201703L。 [注:この国際標準の将来のバージョンは、このマクロの値をreplaceにすることをintendedgreater値を使用します。]


2018年11月現在、使用されているマクロは次のとおりです。

  • GCC 9.0.0:201709L C++ 2aの場合。 Live demo
  • Clang 8.0.0:201707LLive demo
  • VC++ 15.9.3:201704L(@Acornの回答にあるとおり)。

PS:特定の機能に興味がある場合は、 [cpp.predefined](1.8) を使用して対応するマクロを定義します。ただし、将来変更される可能性があることに注意してください。

32
gsamaras

新しい値は [cpp.predefined] p1.1 のある時点で利用可能になります。

_­_­cplusplus

整数リテラル201703L。 [注:この国際標準の将来のバージョンは、このマクロの値をより大きな値に置き換えることを意図しています。 —メモを終了]

主要なコンパイラで使用されている現在の値は、2018年11月30日現在です。

それらはすべてC++ 17の201703L、すでに使用できます:

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

C++ 20はまだ開発中であるため、__cplusplusバージョンはまだ知られていません。 C++ 20のドラフトのみがあります。

最新のドラフトN4788 にはまだ以下が含まれています:

__cplusplus

整数リテラル201703L。 [注:この国際標準の将来のバージョンは、このマクロの値をより大きな値に置き換えることを意図しています。 —注を終了]

それをチェックするために、私は@gsamarasの回答を使用します。

5