私はいくつかのプリプロセッサをセットアップしようとしていますが、C++ 14の__cplusplus
の定義にもっと正確な数字が欲しいのです。標準で義務付けられているものはありますか?
N3936* §16.8[cpp.predefined]/p1:
1次のマクロ名は、実装によって定義されます。
__cplusplus
名前
__cplusplus
は、C++翻訳単位のコンパイル時に値201402L
に定義されます。
N3936はC++ 14になった最終的な作業ドラフトであり、_201402L
という数字は、最終投票のためにC++ 14標準が送信される会議と一致しています( February 2014 )。
*C++標準のコピーを入手したい人は、チェックアウトする必要があります 現在のCまたはC++標準ドキュメントはどこにありますか?
cppreferenceには、「 Predefined macros 。」セクションの__cplusplus
マクロの標準値に関する情報があります。現在、標準値は次のとおりです。
199711L
(C++ 98またはC++ 03)201103L
(C++ 11)201402L
(C++ 14)201703L
(C++ 17)
参考までに、特定のバージョンのマクロの値は、最終的な標準が公開されるまでしっかりと確立されていません。したがって、2019年6月現在、C++ 2aのマクロ値がどうなるかを知る方法はありません。
ライブラリベンダーは通常、#if __cplusplus > 201703L
で「C++ 2a」機能をゲートします。
「C++ 2a」モードのコンパイラベンダーは、ライブラリベンダーの__cplusplus
チェックを満足させる__cplusplus > 201703L
の任意の値を選択するだけです。
GCC(8.x、9.x、およびトランク)-std=c++2a
モードは__cplusplus == 201709L
を設定します。
Clang(5.x、6.x、7.x、8.x、およびtrunk)-std=c++2a
モードは__cplusplus == 201707L
を設定します。
Microsoft Visual Studio(19.20)/std:c++latest
モード設定__cplusplus == 201705L
/Zc:__cplusplus
を渡す場合のみ !それ以外の場合は、199711L
を使用します。気をつけて!
遷移はこれまでどのように処理されてきましたか?:
Clang 4.0.1 -std=c++1z
set __cplusplus == 201406L
。 Clang 5.0.0は-std=c++17
を導入し、-std=c++1z
を-std=c++17
の同義語にし、マクロを(17
/1z
のどれを使用しても)バンプしました201703L
の標準値。
GCC 5.1では、-std=c++1z
と-std=c++17
を同義語として導入し、__cplusplus == 201500L
を設定しました。 GCC 6.4とGCC 7.1の間で、マクロは(使用するスペルに関係なく)201703L
の標準値にバンプされました。
奇妙なことに、Godbolt Compiler Explorerによると、MSVCは-std:c++latest
モードのマクロを201704L
から201705L
にMSVC 19.16と19.20の間でバンプしました。