4

重複の可能性:
C ++ 11のサポートを確認するにはどうすればよいですか?

私は小さなライブラリを書いていますが、コンパイラがサポートするときはいつでもクラス列挙型を使用したいと思います。finalまた、overrideキーワードなど、他のC++11機能も使用したいと思います。

これまで、すべてのバージョンのGCCでコンパイルされるようにトリックを使用してきましたが、Windowsパーティションを起動すると、VisualStudio2010でも文句を言い始めました。これが私が使ったトリックの例です:

#if __GNUC__ == 4 && (__GNUC_MINOR__ > 7 || \
      (__GNUC_MINOR__ == 7 && __GNUC_PATCHLEVEL__ > 1))
#   define TATO_OVERRIDE override
#   define TATO_NO_THROW nothrow
#else
#   define TATO_OVERRIDE
#   define TATO_NO_THROW throw()
#endif

Visual Studioの最新バージョンは、すでに一連の新機能もサポートしていることを私は知っています。私が欲しいのは、私が使用しているコンパイラで利用できる機能を教えてくれるマクロのセットのようなものです。

#ifdef THIS_COMPILER_SUPPORTS_CLASS_ENUMS
  ...
#endif

これは存在しますか?それを行うライブラリはありますか?


コンパイラのドキュメント?

はっきりさせておきます。私はそれらの情報を見つける方法を知っています、私の問題は他の場所にあります。特に、同じコンパイラがそのバージョンに関して異なる機能をサポートしている可能性があるため、これらの情報を収集するために、考えられるすべてのコンパイラのドキュメントを調べたくありません。これは私がこれまでやってきたことであり、私が探しているのは実際にはそれをしない方法です。

4

4 に答える 4

4

Boostには、実際にそのようなマクロが幅広く用意されています。あなたはそれを使うことができます。それ以外の場合、唯一の方法は、基本的にコンパイラのバージョンを確認し、そのバージョンでサポートされている機能に関する知識を使用して、機能が使用可能かどうかを判断することです。

基本的に、手動を除いて、Boostが行うこと。

于 2012-10-10T14:47:36.510 に答える
3

標準化された機能テストメカニズムを使用することについての議論がありましたが、これは意味がないことがわかりました。コンパイラが標準を実装している場合、すべての機能テストでが得られtrueます。そうでない場合は、機能テストの観点から標準に準拠していると見なす理由はありません。

したがって、ある種の構成ファイルを使用することが最も信頼できるアプローチのようです。個人的には、コンパイラのバージョンを明示的にチェックするのとは異なる方法で行います。代わりに、コンパイラが特定の機能を許容できる程度にサポートしているかどうかを試す何かを使用します。autoconf構成は、または同様の観点から実行できます。

結果の構成に関しては、構成ヘッダーの外部で条件付きコンパイルを使用せずに、適切な構成にマップしようとします。たとえば、次のようなものを使用します。

#if defined(KUHL_HAS_CLASS_FINAL)
#  define kuhl_class_final final
#else
#  define kuhl_class_final
#endif

特にクラス列挙型の場合、列挙値はスコープ内でのみ使用可能であり、値はスコープ外でのみ使用可能であるため、少し注意が必要な場合があります。したがって、一方のケースでは何らかの形の追加のネストを考え出す必要があるかもしれませんが、もう一方のケースでは考え出す必要はありません。

于 2012-10-10T14:42:45.650 に答える
1

clangには、さまざまな機能チェック用の組み込みマクロがいくつかあります。clang機能チェックマクロ すべてのコンパイラベンダーがこれら(およびそれ以上)を採用するのであれば、すばらしいでしょう。

于 2012-10-10T14:40:43.823 に答える
0

「私が欲しいのは、使用しているコンパイラで使用できる機能を教えてくれる一連のマクロのようなものです。」

標準にはそのようなものはありません。

コンパイラーの違いに対する実際的なアプローチは、サポートするコンパイラーとコンパイラーのバージョンごとにヘッダーを作成することです。これらのヘッダーは同じ名前である必要があります。どちらが含まれるかは、インクルードパス、ツールの使用法によって異なります。これは、コンパイラごとに簡単にカスタマイズできます。

私はその概念を仮想ヘッダーと呼んでいます。システム依存関係、コンパイラ依存関係、バージョン依存関係の3つのレベルでうまく機能することがわかりました。スキームはそれ以上にスケールアップしないと思いますが、一方で、それが必要なすべてのようです。

于 2012-10-10T14:36:15.457 に答える