2

コンパイル時に C++0x 機能が利用可能かどうかを判断しようとしています。一般的なプリプロセッサ マクロはありますか? Visual Studio 2010 のコンパイラと Intel のコンパイラを使用しています。

4

3 に答える 3

4

マクロの値はより大きい値に__cplusplusなります。199711L

とはいえ、すべてのコンパイラがこの値を埋めるわけではありません。ロジャーのソリューションを使用することをお勧めします。

于 2009-12-29T17:28:56.073 に答える
3

これを行う通常の方法は、ビルド システムでそれを決定し、コンパイル時に、一般に HAS_* という名前の「構成マクロ」を渡すことです。例: compiler -DHAS_LAMBDA source.cpp.

コンパイラ バージョンのマクロからこれを判断できる場合は、それをチェックする構成ヘッダーでこれらのマクロを定義できます。ただし、コマンドライン オプションによって制御されるものに対しては、これを行うことはできません。ただし、ビルド システムは、指定したオプションを認識しており、その情報を使用できます。

実際の例と、特定のコンパイラ、バージョン、および機能に関する多くの詳細については、boost.configを参照してください。

于 2009-12-29T18:22:41.193 に答える
2

nullptr と auto_ptr で同様の問題が発生しました。何かが標準化されるまで、私たちが使用しようとしているものは次のとおりです。

#include <cstddef>
...

// GCC: compile with -std=c++0x
#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || (__GNUC__ >= 5))
# define HACK_GCC_ITS_CPP0X 1
#endif

#if defined(nullptr_t) || (__cplusplus > 199711L) || defined(HACK_GCC_ITS_CPP0X)
# include <memory>
  using std::unique_ptr;
# define THE_AUTO_PTR  unique_ptr
#else
# include <memory>
  using std::auto_ptr;
# define THE_AUTO_PTR  auto_ptr
#endif

GCC と Microsoft の Visual Studio でうまく動作します。ちなみに、nullptrはキーワードであり、テストできません。これがテストの理由ですnullptr_t

于 2011-08-12T03:59:43.313 に答える