Cにはあります__STDC__
が、一部の拡張 C++ 方言を認識する標準的な方法はないようです。したがって、私が使用するポータブルコードの場合
#define __is_extended \
((__GNUG__ &&!__STRICT_ANSI__) || \
(_MSC_VER && _MSC_EXTENSIONS && __cplusplus) || \
(__IBMCPP__ && __EXTENDED__))
これは、これまでのところ gcc、XLC、および Visual C++ で機能します。
ISO/ANSI 準拠をコンパイラごとに個別にテストする必要がありますよね? もしそうなら、動作することが証明されている他のコンパイラについて提案できますか?
編集: このようなテストの賛否については非常に多くの議論があったため、ここに実際の例を示します。複数のプロジェクトの複数のコンパイラで広く使用されているヘッダーstuff.hがあるとします。stuff.hは、いくつかのコンパイラ固有vsnprintf
(C++11 より前に標準化されていない)、いくつかcopy_if<>
( C++98 ではなぜか見逃していた)、独自のミューテックス ガードなどを使用します。クリーンな C++11 バリアントを実装する際に、古い (ただし信頼できる) 実装をいくつか#if __is_extended
(より良い:__is_idosyncratic
または!__is_ANSI_C11
) でラップします。新しい C++11 は#else
. まだ C++0x または C++98 としてコンパイルされる翻訳単位にstuff.hが含まれている場合何も変わっていません。コンパイル エラーはなく、実行時の動作も異なりません。C++11 は実験的なままです。コードはメイン ブランチに安全にコミットでき、同僚はそれを研究し、そこから学び、コンポーネントに技術を適用できます。