2009-04-07 10 views
5

ログファイルを.hppファイルに保存しているプログラムをプログラミングしています。 <tr1/unordered_map>(コンパイラがTR1をサポートしている場合)またはそれ以外の場合は<map>を含めることにします。 tr1が利用可能かどうかをコンパイル時にチェックする標準的な方法はありますか?コンパイル中にTR1をチェックするには?

__cplusplus」というシンボルが定義されているのと同じ方法で、「__cxx__tr1」などと定義されている可能性があります。私はTR1のドラフトでそれを見ていないので、それは存在しないと仮定しますが、私は最初に尋ねたいと思っていました。注意点としては

それらの定義が存在しない場合、提案自身でそれらを含めることは悪い考えではないでしょう。これは明らかに、標準ではない、

#define __GXX_EXPERIMENTAL_CXX0X__ 1 

しかし:

答えて

2

あなたは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 
+0

OK、これは私が避けたかったオプションでした。ちょうど.hppファイルをリリースして実行したいのです。これらの「ほぼ標準的な」ものについては、本格的な構成を実行するのではなく、単純な比較が好まれます。 –

+0

私はこの答えを受け入れているようですが、それは方法がないと思われ、これはよりよい方法と思われます... –

2

GCC-4.3を持っています。私はニーズに対処

+0

このマクロは、g ++ -std = C++ 0xを使用し、次にstd :: unordered_mapでunordered_mapを使用する場合に定義されます。それ以外の場合(no -std = C++ 0x)、この定義はありませんが、 includeおよびstd :: tr1 :: unordered_mapクラスを使用することはできます。 – Artyom

+0

はい、他の人が指摘しているように、これは設定時にのみテストできるものです。 4.3より前のGCCの他のすべてのバージョンは、-stdスイッチが与えられたときにエラーを投げます。 – greyfade

1

一つのライブラリが利用可能な場合TR1を好む、ブーストからTR1に追加しましたいくつかのクラスを使用します。解決策(Unixベースのライブラリ)は、チェックをconfigureスクリプトに適用することです。

つまり、いいえ、私が知っているポータブルなものはありません。つまり、Unixを使用している場合、configureスクリプトのチェックは十分に機能します。

2

参照ISO C++(WG21)ペーパーN1575。この論文はTR1から削除されましたが、置き換えられませんでした。したがって、TR1を検出する公式の方法はありません。 1と仮定すると

+0

+1。面白い。私は知らなかった...残念。 –

0

は1つがあることuMapのタイプだろう

#include "boost/tr1/unordered_map.hpp" 
... 
std::tr1::unordered_map<...> uMap; 

何をしていた場合に何が起こるか、VS2010、またはTR1が利用できる持っている任意のスイートを使用していますか?

関連する問題