コンパイル時に C++0x 機能が利用可能かどうかを判断しようとしています。一般的なプリプロセッサ マクロはありますか? Visual Studio 2010 のコンパイラと Intel のコンパイラを使用しています。
3 に答える
マクロの値はより大きい値に__cplusplus
なります。199711L
とはいえ、すべてのコンパイラがこの値を埋めるわけではありません。ロジャーのソリューションを使用することをお勧めします。
これを行う通常の方法は、ビルド システムでそれを決定し、コンパイル時に、一般に HAS_* という名前の「構成マクロ」を渡すことです。例: compiler -DHAS_LAMBDA source.cpp
.
コンパイラ バージョンのマクロからこれを判断できる場合は、それをチェックする構成ヘッダーでこれらのマクロを定義できます。ただし、コマンドライン オプションによって制御されるものに対しては、これを行うことはできません。ただし、ビルド システムは、指定したオプションを認識しており、その情報を使用できます。
実際の例と、特定のコンパイラ、バージョン、および機能に関する多くの詳細については、boost.configを参照してください。
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
。