質問

私たちは.HPPファイル自体を保持、ロギングライブラリをプログラミングしています。私たちは、(コンパイラは、TR1サポートしている場合)、または標準<tr1/unordered_map>そう<map>を含めるしたいと思います。 TR1が利用可能であるかどうコンパイル時にチェックする標準的な方法はありますか?

私は「__cplusplusは」シンボルを定義するのと同じ方法が存在することを考えていた、そのような「__cxx__tr1」か何かが定義されている可能性があります。私はTR1のためのドラフトで、私はそれが存在しないと仮定し、私は念のために最初にお聞きしたかったことを見たことがありません。

これらの定義が存在しない場合は、

注意点としては、提案自分自身でそれらを含めることは悪い考えではないでしょう。

役に立ちましたか?

解決

あなたはautotoolsのように任意の構成ツールを使用している場合は、

あなたのようなテストを書くことを試みることがあります:

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
scroll top