コンパイラーによって実装されているC ++標準のバージョンをどのように判断しますか?私が知る限り、以下は私が知っている標準です:
- C ++ 03
- C ++ 98
c++-faq
タグには、渡す必要のある実際の前提条件の「要求された回数」はありません。それはもののフォーマットと一般性についてです。
コンパイラーによって実装されているC ++標準のバージョンをどのように判断しますか?私が知る限り、以下は私が知っている標準です:
c++-faq
タグには、渡す必要のある実際の前提条件の「要求された回数」はありません。それはもののフォーマットと一般性についてです。
回答:
私の知識では、これを行うための全体的な方法はありません。クロスプラットフォーム/マルチコンパイラサポートライブラリのヘッダーを見ると、コンパイラ固有の構成を使用してそのようなことを決定する多くの定義が常に見つかります。
/*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
取った場合、選択したツールです。このルート)。
__cplusplus
はVS 15.7でのみ部分的に修正されました。その参照のVisual C ++チームのブログ
次のコードを実行してバージョンを確認してください。
#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";
}
/Zc:__cplusplus
)
/Zc:__cplusplus
フラグの使い方を知っていると思われます。もちろんstd::cout << /Zc:__cplusplus;
、コロンとスラッシュを変数名の一部にすることはできないからです。これを行う方法を説明できますか?ありがとう。
達成したいことによっては、Boost.Configが役立つ場合があります。標準バージョンの検出は提供しませんが、特定の言語/コンパイラ機能のサポートを確認できるマクロを提供します。
__cplusplus
C ++ 0xでは、マクロ__cplusplusは、現在の199711Lとは異なる(より大きい)値に設定されます。
__cplusplus
提案どおりに使用します。Microsoftコンパイラに関する注意事項は1つだけです。Zc:__cplusplus
コンパイラスイッチを使用して有効にします。__cplusplus
ソースhttps://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
__STDC__
定義されているかどうか、およびその値はC ++で実装定義されています。
通常は、__cplusplus
defineを使用してc ++ 17を検出する必要がありますが、デフォルトでは、Microsoftコンパイラーはそのマクロを適切に定義していません。https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/を参照してください -必要ですプロジェクト設定を変更して/Zc:__cplusplus
スイッチを含めるか、次のような構文を使用できます。
#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
//C++17 specific stuff here
#endif