web-dev-qa-db-ja.com

__cplusplusディレクティブは、さまざまなコンパイラでどのように定義されていますか?

私のコンパイラはそれを199711Lに拡張します。どういう意味ですか? __cplusplus> 199711LはC++ 11を意味すると読みました。このマクロの可能な展開とは何ですか?それは何を意味しますか?

33
unj2

199711Lは、年= 1997、月= 11(つまり、1997年11月)を表します。委員会が規格を承認した日付で、残りのISOは1998年初頭に承認しました。

2003年の標準については、委員会が(どうやら)その値を変更しないままにすることを決定したほど十分な変更はありませんでした。

2011年の標準の場合、201103L(ここでも、年= 2011、月= 03)として定義する必要があります。これは、委員会が2011年3月に完成した標準を承認したことを意味します。

2014年の標準では、201402Lとして定義する必要があり、上記と同じように解釈されます(2014年2月)。

2017年の標準では、201703L(2017年3月)として定義する必要があります。

元の標準が承認される前は、かなりの数のコンパイラが通常、それを0(または#define __cplusplusのような空の定義)に定義して、「準拠していない」ことを示していました。最も厳しい適合性を求められたとき、多くは1と定義しました。

言及するのをほとんど忘れていましたが、古代コンパイラに関するもう1つのヒント:cfrontのいくつかの初期バージョン(およびおそらくそれをコピーしている他のいくつか)は、c_plusplusではなく__cplusplusを定義しました。それが意味のある値に定義されていることを思い出しません。

42
Jerry Coffin

さまざまなバージョンのプリプロセッサ定義はSD-6に入れるべきだと思います。

#define __cpp_1997 199711L
#define __cpp_2003 __cpp_1997
#define __cpp_2011 201103L
#define __cpp_2014 201402L
#define __cpp_2017 201703L

2020年代を見ると、さらに3つの基準があるかもしれません。 1997年以降、多くの実装者が標準をサポートするコードを持っていることは間違いありません。

私はニーモニックの定義が欲しいので、この投稿に何度も戻る必要はありません。

5
emsr

つまり、1997年のC++標準(批准するには時間がかかりすぎたため、実際にはC++ '98として知られています)と互換性があります。

3
Michael J

質問のタイトルに回答するために、典型的なコンパイラのコレクションを紹介します。コンパイラフラグをデフォルトのままにすると、次のC++標準バージョンが選択されます。

https://Gist.github.com/ax3l/53db9fa8a4f4c21ecc5c4100c0d93c94

0
Ax3l