web-dev-qa-db-ja.com

コンパイラが使用するC ++標準のバージョンを確認する方法は?

コンパイラによって実装されているC++標準のバージョンをどのように判断しますか?私の知る限り、私が知っている標準は次のとおりです。

  • C++ 03
  • C++ 98
91
jasonline

私の知る限り、これを行うための全体的な方法はありません。ライブラリをサポートするクロスプラットフォーム/マルチコンパイラのヘッダーを見ると、コンパイラ固有のコンストラクトを使用してそのようなことを決定する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

おそらく、使用するすべてのコンパイラについて、そのような定義を自分で行う必要があります。

9
RED SOFT ADAIR

Bjarne Stroustrup C++ 0x FAQ から:

__cplusplus

C++ 0xでは、マクロ__cplusplusは、現在の199711Lとは異なる(より大きい)値に設定されます。

これは人が望むほど有用ではありませんが。 gcc(明らかに10年近く)は、この値を1に設定し、gcc 4.7.0がリリースされたときに が修正されるまで、1つの主要なコンパイラを除外しました

これらはC++標準であり、__cplusplusで期待できる値は次のとおりです。

  • C++ C++ 98より前:__cplusplus1です。
  • C++ 98:__cplusplus199711Lです。
  • C++ 98 + TR1:これはC++ 98として読み込まれ、私が知っていることを確認する方法はありません。
  • C++ 11:__cplusplus201103Lです。
  • C++ 14:__cplusplus201402Lです。
  • C++ 17:__cplusplus201703Lです。

コンパイラが古いgccである可能性がある場合、コンパイラ固有のハッカー(バージョンマクロを見て、機能が実装されているテーブルと比較する)を使用するか、 Boost.Config関連マクロを提供します )。この利点は、実際に新しい標準の特定の機能を選択し、機能が欠落している場合に回避策を作成できることです。一部のコンパイラはC++ 11を実装すると主張しますが、機能のサブセットのみを提供するため、これは卸売ソリューションよりも好まれます。

Stdcxx Wikiは、C++ 0x機能のコンパイラーサポートのための 包括的なマトリックスをホストしています (自分で機能を確認したい場合)。

残念ながら、機能の詳細なチェック(std::copy_ifなどの個々のライブラリ関数)は、アプリケーションのビルドシステムでのみ実行できます(機能を使用してコードを実行し、コンパイルして正しい結果を生成したかどうかを確認します-autoconfは、このルートを取る場合に選択するツールです。

205
pmr

次のコードを実行してバージョンを確認してください。

#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";
}
15
Deepanshu

達成したい内容によっては、 Boost.Config が役立つ場合があります。標準バージョンの検出は提供しませんが、特定の言語/コンパイラ機能のサポートを確認できるマクロを提供します。

6
Björn Pollex

__cplusplus

C++ 0xでは、マクロ__cplusplusは、現在の199711Lとは異なる(より大きい)値に設定されます。

C++ 0x FAQ by BS

3
Vinzenz

クイックgoogle の後:

__STDC__および__STDC_VERSION__こちら を参照

0
Tor Valamo