web-dev-qa-db-ja.com

c ++ 14に__cplusplusの標準定義はありますか?

私はいくつかのプリプロセッサをセットアップしようとしていますが、C++ 14の__cplusplusの定義にもっと正確な数字が欲しいのです。標準で義務付けられているものはありますか?

39
Michael Gazonda

N3936* §16.8[cpp.predefined]/p1:

1次のマクロ名は、実装によって定義されます。

__cplusplus

名前__cplusplusは、C++翻訳単位のコンパイル時に値201402Lに定義されます。

N3936はC++ 14になった最終的な作業ドラフトであり、_201402Lという数字は、最終投票のためにC++ 14標準が送信される会議と一致しています( February 2014 )。

*C++標準のコピーを入手したい人は、チェックアウトする必要があります 現在のCまたはC++標準ドキュメントはどこにありますか?

45
T.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の間でバンプしました。

7
Quuxplusone