コンパイル中TR1をチェックする方法は?
-
05-09-2019 - |
質問
私たちは.HPPファイル自体を保持、ロギングライブラリをプログラミングしています。私たちは、(コンパイラは、TR1サポートしている場合)、または標準<tr1/unordered_map>
そう<map>
を含めるしたいと思います。 TR1が利用可能であるかどうコンパイル時にチェックする標準的な方法はありますか?
私は「__cplusplus
は」シンボルを定義するのと同じ方法が存在することを考えていた、そのような「__cxx__tr1
」か何かが定義されている可能性があります。私はTR1のためのドラフトで、私はそれが存在しないと仮定し、私は念のために最初にお聞きしたかったことを見たことがありません。
注意点としては、提案自分自身でそれらを含めることは悪い考えではないでしょう。
解決
あなたのようなテストを書くことを試みることがあります:
AC_CHECK_HEADER(tr1/unordered_map,[AC_DEFINE([HAVE_TR1],[],["Have tr1"])],[])
AC_CHECK_HEADER(unordered_map,[AC_DEFINE([HAVE_CXX0X],[],["Have C++0x"])],[])
そして、あなたのコードでこれらの定義を使用します。
このようにマクロを設定する書き込み...一般的に言って__cplusplus
マクロはあなたの標準的なバージョン番号を与える必要がありますが、あなたに100%の標準的な実装を与える何のコンパイラはありません。
残念ながら、これはあなたがそれぞれのコンパイラの1001 #ifdef
を書きたい場合を除き、そのようなものをチェックするための唯一の非常に信頼性の高い方法である(何ブースト)
そして
#include "config.h"
#ifdef HAVE_CXX0X
# include <unordered_map>
typedef std::unordered_map<foo,bar> my_map;
#elif HAVE_TR1
# include <tr1/unordered_map>
typedef std::tr1::unordered_map<foo,bar> my_map;
#else
# include <map>
typedef std::map<foo,bar> my_map;
#endif
他のヒント
GCC-4.3があります:
#define __GXX_EXPERIMENTAL_CXX0X__ 1
しかし、これは明らかに、標準ではありません。
を参照してくださいISO C ++(WG21)紙 N1575 >。本論文では、無交換で、TR1から削除されました。だから、TR1を検出する公式の方法はありません。
一つのライブラリには、私が利用可能な場合TR1を好む、ブーストからTR1に追加しましたいくつかのクラスを使用するためのニーズに対処します。溶液(Unixベースのライブラリである)は、configureスクリプトにチェックを押し込むことである。
私の知っているだから、他の言葉で、いや、何もポータブル。それはあなたがUnixを使っている場合は、configureスクリプトのチェックが十分に機能し、述べています。
1はVS2010を使用していると仮定すると、または1つが何をした場合に何が起こるか利用可能TR1を、持っている任意のスイート
#include "boost/tr1/unordered_map.hpp"
...
std::tr1::unordered_map< ... > uMap;
何が可能uMap
のタイプでしょうか?