可能性の重複:
C++11 Feature CheckingGCCのバージョン間で利用可能なC++ 11の機能を正しく検出するにはどうすればよいですか?
私はGCC 4.7の導入でC++ 11標準ライブラリを散らかされているように見えるnoexcept
仕様の場合には特に興味があります。この場合、コンパイラのバージョンを検出するだけで十分です。それは移植可能なコードを生成するための最良のメカニズムですか?
#include <system_error>
class server_error_category : public std::error_category
{
public:
virtual const char* name() const { ... }
//
// fails beginning with gcc4.7,
// looser throw specifier ...
// overriding 'virtual const char* std::error_category::name() const noexcept (true)
...
};
[Boost.Config](のhttp:// www.boost.org/libs/config/)は 'noexcept'仕様をサポートしていないコンパイラのマクロBOOST_NO_NOEXCEPTを定義します。 GCC以外のコンパイラでの移植性が懸念される場合は、Boostにあなたに苦労してもらうことをおすすめします。 – ildjarn
@ildjam Gar、それほど最近のことではない! –
'#if defined(__ has_feature)&& __has_feature(cxx_noexcept)'を実行すると、それを実装していないコンパイラでnoexceptを使用しないことが保証されます。一方、機能検査マクロをサポートしていないため、サポートしていないコンパイラでnoexceptを利用することはできません...(AFAIK __has_featureはClangでのみ動作します) – bames53