C++0x / C++11 の可用性
今日の時点で、GCC が C++0x/C++11 を使用しているかどうかを検出する唯一の方法は、定義済みのマクロを確認することです__GXX_EXPERIMENTAL_CXX0X__
。
#ifdef __GXX_EXPERIMENTAL_CXX0X__
// C++11 code
#else
// C++03 code
#endif
これは将来変更される可能性があることに注意してください (したがって、EXPERIMENTAL
マクロの一部です)。
編集:実際、@stephanがコメントで指摘するまで私が知らなかったより良い方法があります:
16.8/1 [cpp.predefined]
次のマクロ名は、実装によって定義されます。
__cplusplus
名前は、C++ 翻訳単位をコンパイルするとき__cplusplus
に値に定義されます。157201103L
157) この標準の将来のバージョンでは、このマクロの値をより大きな値に置き換える予定です。非準拠のコンパイラは、最大で 5 桁の 10 進数の値を使用する必要があります。
だから私はあなたができると思います:
#if defined(__cplusplus) && (__cplusplus >= 201103L)
しかし、これは標準化前の C++0x GCC バージョンでは機能しないのではないかと心配しています。したがって、おそらく両方__GXX_EXPERIMENTAL_CXX0X__
と__cplusplus
一緒に使用します。
#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__cplusplus) && (__cplusplus >= 201103L))
C++0x / C++11 の互換性
ただし、C++0x/C++11 サポートが有効になっているかどうかを検出するには、これだけでは必ずしも十分ではない場合があります。C++11 サポートは、コア言語レベルだけでなくライブラリ レベルでも、GCC バージョン全体で大幅に変更されています。 .
私の最善の策は、C++ 11 サポートに受け入れられる最小の GCC バージョンを見つけ、上記のテストを GCC バージョン テストと組み合わせることです。
#if (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ >= 5)) // for GCC 4.7+
boost
との切り替えstd
C++03 はテンプレート化された typedef をサポートしていないため、切り替えは少し面倒boost::shared_ptr
です。std::shared_ptr
私は、必要な定義を次のようにラップしますtemplate struct
。
#if (defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__cplusplus) && (__cplusplus >= 201103L))) \
&& (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ >= 5))
template<typename T>
struct my_shared_ptr {
typedef std::shared_ptr<T> type;
// you may also want to forward make_shared etc, this is left as an exercise
};
#else
template<typename T>
struct my_shared_ptr {
typedef boost::shared_ptr<T> type;
// you may also want to forward make_shared etc, this is left as an exercise
};
#endif
my_shared_ptr<int>::type ptr(new int);
編集:(shared_ptr
再び)おっと、単純な非テンプレートusing
ディレクティブで権利をインポートする@ComicSansMSの方法に気づきました。なぜ私はそれについて考えなかったのか分かりません。
それでも、私は GCC で C++0x/C++11 を検出する方法について説明しました。