7

最初はBoost.Regexに依存するポータブルC++ライブラリコードを作成しようとしていますが、コンパイラがサポートしているのでTR1に移行し、std::tr1名前空間から移動した後に最終的にC++0x仕様に移行します。 stdに。これが私がプリプロセッサでやりたいことのためのいくつかの擬似コードです:

if( exists(regex) )    // check if I can #include <regex>
{
    #include <regex>    // per TR1
    if( is_namespace(std::tr1) )   // are we on TR1 or C++0x?
    {
        using std::tr1::regex;
    } else
    {
        using std::regex;
    }
} else    // fall-back to boost
{
    #include <boost/regex.hpp>
    using boost::regex;
}

確かに、それはすべてプリプロセッサディレクティブに含まれている必要がありますが、それを実現する方法を知っていれば、ここでは質問しません。:)

4

4 に答える 4

10

処理の前にサードパーティのものに依存せずにそれを行うことはできません。一般的に、のようなものautoconfはこれを達成するために使用することができます。

これらは、使用するヘッダー/ライブラリの存在を示すディレクティブを含む別のヘッダーファイルを生成することによって機能#defineします。

于 2009-07-25T08:57:59.870 に答える
6

あなたはそれをすることはできません。C ++の前処理フェーズはコンパイルフェーズの前に行われるため、C++言語の条件付き構文を#includeのようなプリプロセッサディレクティブの周りに配置することはできません。

条件付きコンパイルが必要な場合は、#ifdefを使用する方法があります。何かのようなもの:

#ifdef BOOST_BUILD
  #include "somebooststuff.h"
  using namespace boost;
#else
  #include "somestdstuff.h"
  using namespace std;
#endif

ここで、BOOST_BUILDは、makefileなどで定義するプリプロセッサシンボルです。

于 2009-07-25T08:55:52.200 に答える