1. ホーム
  2. c++

[解決済み] C++11のサポート状況を確認する方法を教えてください。

2022-10-10 13:42:48

質問

コンパイラが C++11 の特定の機能をサポートしているかどうかを、コンパイル時に検出する方法はありますか。 たとえば、次のようなものです。

#ifndef VARIADIC_TEMPLATES_SUPPORTED

#error "Your compiler doesn't support variadic templates.  :("

#else

template <typename... DatatypeList>
class Tuple
{
    // ...
}

#endif

どのように解決するのですか?

クイックヒストリー

この質問がなされた 2011 年 2 月は、C++11 のサポートに一貫性がありませんでした。コンパイラーは標準に追いつくのに時間が必要だったため、それまでの間、部分的なサポートでリリースしていました。たとえば、あるコンパイラーは可変個体テンプレートを実装していても auto .

C++11 機能のサブセットに依存するコードがある場合、それらを具体的にサポートしているかどうかをコンパイラーに問い合わせる標準的な方法がありませんでした。

そのため チェック に対して 全体 での C++11 サポート #if __cplusplus >= 201103L が、です。

  • その定数と意味は、後に標準が受理された 2011 年 8 月まで、技術的に正式なものではありませんでした。
  • これはあまりにも粗雑でした。コンパイラはおそらく __cplusplus201103L を手に入れたら フル をサポートするコンパイラがあった場合、そのコンパイラを拒絶することになります。そのため、これを使用すると、コードをコンパイルするために使用したいコンパイラのほとんどまたはすべてを不必要に拒否することになります。

1 つの実用的な解決策は、サードパーティの Boost.Config ライブラリを使うことでした。 機能テストマクロの束 . Boost.Config のメンテナはどのコンパイラがどの機能をサポートしているかを記録しており、 それに従ってそれぞれの Boost.Config のリリースごとにマクロを更新しました。

(この Boost に関するものは の回答に基づいています。 からです。 James McNellis .

今日

C++11

今日から C++11 標準全体をサポートするすべての主要なコンパイラーのバージョンがあります。 . .

もしあなたのコードが が必要な場合 を必要とする場合、コンパイラが C++11 をサポートすることを要求するのは妥当なことです。 すべて をサポートする必要があります。 #if __cplusplus >= 201103L . ( このマクロの規格参照は @Paulo M さんの回答を参照してください。 .) しかし、そこには MSVC での複雑な問題 -を参照してください。 ドナルド・ダックの回答 .

その先

C++20 以降、粗視化された __cplusplus マクロに加え #include <version> を取得するために 機能テスト用マクロの束 . これは基本的に、標準規格に基づいた Boost.Config .

によると からのこの回答は によると、これらのマクロは、少なくともいくつかの 2016 年代の C++14 コンパイラーで実際に利用可能です。