私のコンパイラはそれを199711Lに拡張します。どういう意味ですか?__cplusplus>199711LはC++11を意味することを読みました。このマクロの可能な拡張とは何ですか?それは何を意味しますか?
4 に答える
199711Lは、Year = 1997、Month = 11(つまり、1997年11月)を表します。これは、委員会が1998年の初めにISOの他の部分が承認した規格を承認した日付です。
2003年の基準では、委員会が(明らかに)その値を変更しないことを決定したほどの変更はほとんどありませんでした。
2011年の基準については、201103L(ここでも、年= 2011、月= 03)として定義する必要があります。これは、委員会が2011年3月に最終化された基準を承認したことを意味します。
2014規格の場合、上記と同じように解釈された201402Lとして定義する必要があります(2014年2月)。
2017規格では、201703L(2017年3月)として定義する必要があります。
2020規格では、値が202002L(2020年2月)に更新されました。
元の標準が承認される前は、かなりの数のコンパイラが通常、「不適合」を意味するようにそれを定義していました0
(またはのような空の定義)。#define __cplusplus
最も厳密な適合性を求められたとき、多くの人がそれをに定義しました1
。
私はほとんど言及するのを忘れていましたが、古代のコンパイラについてもう1つ、cfrontの初期バージョンのいくつか(そしておそらくそれをコピーしている他のいくつか)がc_plusplus
の代わりに定義されてい__cplusplus
ます。しかし、それが意味のある値に定義されていることを覚えていません。
さまざまなバージョンのプリプロセッサ定義は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年以降、多くの実装者が標準をサポートするコードを持っていることは間違いありません。
私はニーモニック定義が欲しいので、この投稿に戻ってくる必要はありません。
つまり、1997年のC ++標準(批准に時間がかかりすぎたため、実際にはC ++'98として知られています)と互換性があります。
C++20の__cplusplus値
Acornの回答によると、__ cplusplusは、リンクcpp.predefined(1.1)に基づいて202002としてマクロ定義されています。この定義は、このcppreferenceにもあります。__cplusplusを検索します
その後、これは202004に更新されました
VisualStudioコミュニティ2019でのMicrosoftVisualC ++の実際の値を知るには、次の手順を実行します。
- VisualC++プロジェクトを作成する
- ソリューションを右クリックします。
- ドロップダウンメニューで、下部にある[プロパティ]をクリックします
- ポップアップダイアログが開きます
- 「構成プロパティ」をクリックして展開します
- 「C/C++」をクリックして展開します。
- 「すべてのオプション」をクリックします。
- 右側に「追加オプション」があります
- このペーストの隣接する右側の列:/ std:c ++ latest / Zc:__ cplusplus
- 右側に「追加オプション」があります
- 「すべてのオプション」をクリックします。
- 「C/C++」をクリックして展開します。
「適用」ボタンをクリックしてから「OK」ボタンをクリックします
関数main()で、次のコードを実行して__cplusplusの値を取得します
int main()
{
long cppVer = __cplusplus;
std::cout << "__cplusplus value for C++20 is: ";
std::cout << std::to_string( cppVer ) << std::endl;
}
コードは次のように表示されます。
__cplusplus value for C++20 is: 202004