コンパイラによって実装されているC++標準のバージョンをどのように判断しますか?私の知る限り、私が知っている標準は次のとおりです。
私の知る限り、これを行うための全体的な方法はありません。ライブラリをサポートするクロスプラットフォーム/マルチコンパイラのヘッダーを見ると、コンパイラ固有のコンストラクトを使用してそのようなことを決定するa lotの定義が常に見つかります。
/*Define Microsoft Visual C++ .NET (32-bit) compiler */
#if (defined(_M_IX86) && defined(_MSC_VER) && (_MSC_VER >= 1300)
...
#endif
/*Define Borland 5.0 C++ (16-bit) compiler */
#if defined(__BORLANDC__) && !defined(__WIN32__)
...
#endif
おそらく、使用するすべてのコンパイラについて、そのような定義を自分で行う必要があります。
Bjarne Stroustrup C++ 0x FAQ から:
__cplusplus
C++ 0xでは、マクロ
__cplusplus
は、現在の199711L
とは異なる(より大きい)値に設定されます。
これは人が望むほど有用ではありませんが。 gcc
(明らかに10年近く)は、この値を1
に設定し、gcc 4.7.0がリリースされたときに が修正されるまで、1つの主要なコンパイラを除外しました 。
これらはC++標準であり、__cplusplus
で期待できる値は次のとおりです。
__cplusplus
は1
です。__cplusplus
は199711L
です。__cplusplus
は201103L
です。__cplusplus
は201402L
です。__cplusplus
は201703L
です。コンパイラが古いgcc
である可能性がある場合、コンパイラ固有のハッカー(バージョンマクロを見て、機能が実装されているテーブルと比較する)を使用するか、 Boost.Config ( 関連マクロを提供します )。この利点は、実際に新しい標準の特定の機能を選択し、機能が欠落している場合に回避策を作成できることです。一部のコンパイラはC++ 11を実装すると主張しますが、機能のサブセットのみを提供するため、これは卸売ソリューションよりも好まれます。
Stdcxx Wikiは、C++ 0x機能のコンパイラーサポートのための 包括的なマトリックスをホストしています (自分で機能を確認したい場合)。
残念ながら、機能の詳細なチェック(std::copy_if
などの個々のライブラリ関数)は、アプリケーションのビルドシステムでのみ実行できます(機能を使用してコードを実行し、コンパイルして正しい結果を生成したかどうかを確認します-autoconf
は、このルートを取る場合に選択するツールです。
次のコードを実行してバージョンを確認してください。
#include<iostream>
int main() {
if (__cplusplus == 201703L) std::cout << "C++17\n";
else if (__cplusplus == 201402L) std::cout << "C++14\n";
else if (__cplusplus == 201103L) std::cout << "C++11\n";
else if (__cplusplus == 199711L) std::cout << "C++98\n";
else std::cout << "pre-standard C++\n";
}
達成したい内容によっては、 Boost.Config が役立つ場合があります。標準バージョンの検出は提供しませんが、特定の言語/コンパイラ機能のサポートを確認できるマクロを提供します。
__cplusplus
C++ 0xでは、マクロ__cplusplusは、現在の199711Lとは異なる(より大きい)値に設定されます。
クイックgoogle の後:
__STDC__
および__STDC_VERSION__
、 こちら を参照