2012-05-23 16 views
45

可能な限りC++ 11x拡張機能を使用したいが、サポートされていない場合はフォールバックが必要なコードがある場合。現在、GCCのOSX版とVisualCコンパイラは、C++ 11Xのサポートはありませんがほとんどを持っているので、私は使用します。C++ 11xサポートを検出するプリプロセッサディレクティブはありますか?

#if (defined(__APPLE__) || (defined(_WIN32))) 
    ...fallback code without C++11x ... 
#else 
    ... code using C++11x ... 
#endif 

そして、これは動作しますが、特にGCCいるので、実際に行うには正しいことではありませんMacPortsのコンパイラは、C++ 11xをサポートしています。

#define C11X_SUPPORTEDタイプのマクロはありますか?おそらくGCCだけが持っているものでしょうか?

+3

問題は、GCCがまだC++ 11を完全にサポートしていないことです。そのため、実際に使用する機能に依存します。 – juanchopanza

+4

は仕事を促進します:http://www.boost.org/doc/libs/1_49_0/libs/config/doc/html/boost_config/boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_c__11_features_not_supported? – rve

+1

@rve:答えとして投稿しなかったのはなぜですか?それは良いものです。 *フル*サポートはまだありませんが、注意して、 –

答えて

44

__cplusplusのようなものが事前C++ 11のコンパイラ、C++ 11をsuportingたもので201103L199711Lとして定義する必要があります。これが実際に多くの助けになるかどうかは別の質問です。ほとんどのコンパイラは途中にありますので、あなたが興味を持っている機能をサポートしていても、201103Lと定義しないでください。そして、例えば199711Lと定義し、テンプレートの場合はexportをサポートしていないコンパイラです。しかし、機能テストでは標準機能はありません。

最も単純な解決策は、すべてのコンパイラがサポートしていることを確認できるまで、特定の新機能を使用しないことです。とにかくフォールバックコードを作成してサポートする必要があります。なぜ2つのバージョンを維持するのですか?この規則の例外の1つは、コンパイラが移動セマンティクスをサポートしているかどうかにかかわらず、パフォーマンスに影響を与える新機能です。そのような場合は、コンパイラ依存のインクルードファイルをお勧めします。このファイルは、コンパイラのドキュメントと個人的なテストに基づいて作成します。コンパイラが特定の機能をサポートしていると文書化しているだけであっても、そのサポートがバグフリーであることを意味するものではありません。対象のコンパイラごとにディレクトリを作成し、そこにこのファイルを置き、メイクファイルまたはプロジェクトファイルに適切な-Iまたは/Iオプションを指定します。コンパイラ、バージョンまたは何でも上の

#ifdef HAS_MOVE_SEMANTICS 
... 
#endif 

だけではなく:

そして、あなたのテストでは、の線に沿って何かする必要があります。

+0

"コンパイラが嘘をついていることはあまり知られていません" - GCCは驚くほど真実を伝えています。あるいは、むしろ、いくつかのバージョンがあります。約4.7-ishより前では、 '__cplusplus'は' 1'です。これはC++ 98の完全な実装ではないので正しいです。その後、C++ 98モードで準拠を主張するように変更されました。 –

+0

@SteveJessop g ++には、C++ 98またはC++ 03の完全な実装はありませんでした。それは決して '輸出'を実現しなかった。だから '__cplusplus'が' 199711L'だったら、それは横たわっていました。 (もちろん、この状況では一人ではありません) –

+7

これは私が言っていることですが、GCCは最近嘘をついて変わってしまいましたが、以前は真実を語っていました。その理由は、C++ 98を実装していないか、C++ 11を実装していないという真実を伝えているのかどうかは分かりませんでした。これで、C++ 98の実装に関して、そしてC++ 11を実装していないという事実がいつ伝わってくるのかを区別することができます。イッピー誰もC++ 98(またはC++ 03)を実装したことはないと思うので、 '__cplusplus'の正確な値は基本的に無駄です。それは常に実装特有のものか、嘘つきのものかです。 –

25

__cplusplusマクロの値を確認できます。 C++ 11では、それは199711Lより大きい。

ので

#if __cplusplus > 199711L 

#endif 
+3

。 – juanchopanza

+1

@juanchopanzaええ、これはC++ 11の完全なサポートを保証するものでも、コンパイラがC++ 11をまったくサポートしているわけでもありません。 –

+8

コンパイラが存在することが知られている警告もあります。 –

7

Boost.Configライブラリは、指定されたC++ 11機能の存在に基づいて条件付きコンパイルに使用できるgranular preprocessor macrosを提供します。

(コンパイラの場合、C++ 11のサポートは、オール・オア・ナッシングの命題である必要はありません。たとえば、Microsoft cherry picked which C++11 featuresは、彼らが最も顧客に利益をもたらすと信じていたものに基づいてVisual Studioの2012年に含める方法を検討してください。)

関連する問題