[解決済み] C++11のサポート状況を確認する方法を教えてください。
質問
コンパイラが 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 月まで、技術的に正式なものではありませんでした。
-
これはあまりにも粗雑でした。コンパイラはおそらく
__cplusplus
に201103L
を手に入れたら フル をサポートするコンパイラがあった場合、そのコンパイラを拒絶することになります。そのため、これを使用すると、コードをコンパイルするために使用したいコンパイラのほとんどまたはすべてを不必要に拒否することになります。
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 コンパイラーで実際に利用可能です。
関連
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】一致する関数ポインターを呼び出すためにタプルを「解凍」する
-
[解決済み] 可変個体関数のすべての引数に対してstd::forwardをどのように呼び出すか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み】特定のVisual Studioのバージョンでコードをコンパイルしているかどうかを検出する方法は?