53

可能な限り C++11x 拡張機能を使用したいコードがある場合、これがサポートされていない場合はフォールバックします。現在、GCC の OSX バージョンと VisualC コンパイラは C++11x をほとんどまたはまったくサポートしていないため、以下を使用します。

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

これは機能しますが、特に MacPorts の gcc コンパイラが c++11x をサポートしているため、実際には正しいことではありません。

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

4

3 に答える 3

55

__cplusplus199711LC++11 をサポートするコンパイラでは、C++11 より前のコンパイラと同様に定義する必要があります201103L201103Lこれが実際に役立つかどうかは別の問題です。ほとんどのコンパイラはまだ道半ばなので、興味のある機能をサポートしているとしても、それを として定義するべきではありません。たとえば、それをテンプレートとして定義し、199711Lサポートしていないコンパイラ。exportしかし、機能テストによる標準機能はありません。

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

そして、あなたのテストは次のようなものでなければなりません:

#ifdef HAS_MOVE_SEMANTICS
...
#endif

コンパイラ、バージョンなどだけではありません。

于 2012-05-23T10:04:54.260 に答える
29

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

だから何か

#if __cplusplus > 199711L

#endif
于 2012-05-23T09:54:10.780 に答える