ここで使用できる「機能テスト」マクロは2つあります。
__has_feature
と__has_extension
これらの関数のようなマクロは、機能の名前である単一の識別子引数を取ります。__has_feature
機能がClangでサポートされ、現在の言語標準で標準化されている__has_extension
場合は1と評価され、機能が現在の言語でClangによってサポートされている場合(言語拡張または標準言語機能として)は1と評価されます。そうでない場合は0。
これらのマクロと識別子は、次の場所に記載されています。
http://clang.llvm.org/docs/LanguageExtensions.html
特定の例では、次のHelloWorldが最も有益です。
#if __has_extension(cxx_generalized_initializers)
#warning __has_extension(cxx_generalized_initializers) is true
#else
#warning __has_extension(cxx_generalized_initializers) is false
#endif
#if __has_feature(cxx_generalized_initializers)
#warning __has_feature(cxx_generalized_initializers) is true
#else
#warning __has_feature(cxx_generalized_initializers) is false
#endif
#if __has_extension(cxx_range_for)
#warning __has_extension(cxx_range_for) is true
#else
#warning __has_extension(cxx_range_for) is false
#endif
#if __has_feature(cxx_range_for)
#warning __has_feature(cxx_range_for) is true
#else
#warning __has_feature(cxx_range_for) is false
#endif
int main()
{
}
私の場合、-std = c ++ 03を使用すると、次のように出力されます。
test.cpp:4:2: warning: __has_extension(cxx_generalized_initializers) is false [-W#warnings]
#warning __has_extension(cxx_generalized_initializers) is false
^
test.cpp:10:2: warning: __has_feature(cxx_generalized_initializers) is false [-W#warnings]
#warning __has_feature(cxx_generalized_initializers) is false
^
test.cpp:14:2: warning: __has_extension(cxx_range_for) is true [-W#warnings]
#warning __has_extension(cxx_range_for) is true
^
test.cpp:22:2: warning: __has_feature(cxx_range_for) is false [-W#warnings]
#warning __has_feature(cxx_range_for) is false
^
4 warnings generated.
一方、-std = c ++ 11を使用すると、出力は次のように変わります。
test.cpp:2:2: warning: __has_extension(cxx_generalized_initializers) is true [-W#warnings]
#warning __has_extension(cxx_generalized_initializers) is true
^
test.cpp:8:2: warning: __has_feature(cxx_generalized_initializers) is true [-W#warnings]
#warning __has_feature(cxx_generalized_initializers) is true
^
test.cpp:14:2: warning: __has_extension(cxx_range_for) is true [-W#warnings]
#warning __has_extension(cxx_range_for) is true
^
test.cpp:20:2: warning: __has_feature(cxx_range_for) is true [-W#warnings]
#warning __has_feature(cxx_range_for) is true
^
4 warnings generated.
ユースケースでは、コードをひもで締めて__has_extension(cxx_generalized_initializers)
、trueの場合は新機能を使用し、falseの場合は回避することができます。その後、clangをアップグレードしたり、使用する言語モードが変更されたりすると、コードが自動的に適応します。
サポートされている言語機能とサポートされていない言語機能については、ドキュメントが役立つ場合がありますが、上記のようなテストを作成することが、現在のclangバージョンを評価するための最も高速で正確な方法であることがわかります。