9

標準ライブラリの特定のC++11機能の存在をチェックする良い方法は何ですか。

コンパイラー機能については、(IMHO)メジャーコンパイラー(現時点ではVC ++gccclang 、おそらくIntel)のコンパイラーバージョンを確認する方法をとったところです。これは最善かつ最も柔軟なアプローチではありませんが、わかりません。本当に素晴らしいマクロを持っているclangを除いて、まだもっと良いものの。__has_feature

ただし、コンパイラに厳密に結合されていないライブラリ機能の場合はさらに悪化します。現時点では、VC ++のコンパイラバージョンをチェックするのと同じアプローチを使用したいと思います(独自のライブラリを使用していると仮定すると、非常に簡単です)。clangの場合、少なくとも__has_include大規模なヘッダーベースのクエリに使用できます。それ以外は、定義されている場合はの値を確認することをお勧めしますが、現在のバージョンがサポートしている機能以外に、どの特定のlibstdc++__GLIBCXX__バージョンがどの機能を導入したかについての情報を見つけることができません。

洗練された構成手順やサードパーティのライブラリを使用せずにヘッダーのみのライブラリで使用したいので、メソッドはプリプロセッサチェックなどに保持する必要があります(もちろん、ブーストはサードパーティです)。

  1. それで、それらの(かなり狭い)条件下で特定のC++11ライブラリ機能をチェックする私の可能性は何ですか。たぶん、宣言されている特定の関数やタイプの規模でさえ?

  2. コンパイラまたはライブラリのバージョンを確認することが依然として最善のアプローチである場合、特定のバージョンのlibstdc ++(およびおそらく他の重要な機能、おそらくlibc ++ )でサポートされる特定のC ++ 11機能に関する詳細情報はどこにありますか?

現時点でFWIWは<cstdint>、C ++ 11<cmath>関数とstd::hashに関心がありますが、これは変更される可能性があり、一般的なアプローチではおそらく重要ではありません。

4

2 に答える 2

9

ここでできることは、どのコンパイラがどのバージョンで何を実装しているかを知り、適切な定義を行うこと以外には何もありません。

gcc には、ライブラリ機能用の特別なテーブルがあります。の主な問題は__has_includeもちろん、古いものに住んでいる標準への追加です。libstdc++必要なインクルードもありますが、それはそれらのファイルのコンテンツを有効にするために必要な定義を意味するものではありません。また、利用可能な実装の実際の量については何も教えてくれません (不完全な場合もあります)。

ヘッダーのみのライブラリを使用しているため、これは当てはまりませんが、それでも重要です。C++11 と C++03 の間のバイナリの非互換性が戻ってきて、苦しむ可能性があります。

私は真剣に自分でそれに近づくことはせず、代わりにBoost.Configを使用します。当初は言語機能のみを説明していましたが、現在は標準ライブラリ ヘッダーに拡張されています。

于 2012-08-09T15:07:04.613 に答える
4

チェックする autoconf マクロを書くことができます。そうする場合は、 http ://www.gnu.org/software/autoconf-archive/
に提出してください。 //www.gnu.org/software/autoconf-archive/ax_cxx_header_stdcxx_0x.html#ax_cxx_header_stdcxx_0x しかし、それは複雑な構成チェックを行わないという要件を満たしていません。

それ以外は__GLIBCXX__、定義されている場合は の値をチェックするのが良い考えかもしれません。

の値を見るの__GLIBCXX__は役に立ちません。バージョンがリリースされた日付が含まれているため、バージョンについてはほとんど何もわかりません (たとえば、4.6.3 は 4.7.0 の後にリリースされているため、日付は遅くなりますが、__GLIBCXX__C++11 の機能は少なくなります) .) GCC で libstdc++ を使用する場合、バージョンのチェックに一般的な GCC バージョン番号を使用する__GLIBC__必要__GLIBC_MINOR__があります (一般に、libstdc++ の特定のバージョンは、付属の GCC リリースでのみ使用できます)。

編集: GCC 7 以降では、libstdc++ ヘッダーによって定義された新しいマクロがあり_GLIBCXX_RELEASE、これは GCC の と同じ値に定義されていますが、GCC__GNUC__以外のコンパイラで libstdc++ ヘッダーを使用している場合でも使用できます。

しかし、現在のバージョンがサポートしているもの以外に、どの特定の libstdc++ バージョンがどの機能を導入したかについての情報を見つけることができません。

以前のリリースの libstdc++ C++11 ステータス テーブルは、すべての GCC ドキュメントが存在するオンラインで入手できます: http://gcc.gnu.org/onlinedocs/

4.7 の場合はhttp://gcc.gnu.org/onlinedocs/gcc-4.7.1/libstdc++/manual/manual/status.html#status.iso.2011にあり、4.6 の場合はhttp://gcc.gnu にあります。 org/onlinedocs/gcc-4.6.3/libstdc++/manual/manual/status.html#status.iso.200xおよび以前のリリースの場合はソースに含まれています (ただし、4.6 より前のリリースのカバレッジはいずれにせよかなり不安定です)。

いくつかの追加機能は、各バージョンのリリース ノートに記載されています。たとえば、 http: //gcc.gnu.org/gcc-4.7/changes.html (libstdc++ セクション)。

編集: C++17 ライブラリのサポートについては、機能を最初に追加したバージョンを一覧表示するようになったため、最新のドキュメントを参照するだけで済みます: https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html# status.iso.201z

現時点で私が興味を持っているのはFWIW <cstdint>、C++ 11<cmath>関数とstd::hash

これらは、C++0x/C++11 をサポートする libstdc++ のすべてのバージョンに存在する必要があります。

于 2012-08-12T20:02:39.533 に答える