2

私は、Turtle lib 1.2.4 と Visual Studio Express 2013 のコンパイラで Boost 1.46 を使用しています。MOCK には次のクラスがあります。

struct IPredicate
{
    virtual ~IPredicate() {}

    virtual bool operator()(float value) = 0;
};

MOCK_NON_CONST_METHOD で operator() をモックすると:

MOCK_BASE_CLASS(MockPredicate, IPredicate)
{
    MOCK_NON_CONST_METHOD(operator(), 1, bool(float), id)
};

構文エラー「演算子」などのコンパイラエラーがたくさんありました。しかし、MOCK_NON_CONST_METHOD_EXT でモックすると:

MOCK_BASE_CLASS(MockPredicate, IPredicate)
{
    MOCK_NON_CONST_METHOD_EXT(operator(), 1, bool(float), id)
};

すべてが問題なく、完全に機能します。http://turtle.sourceforge.net/turtle/reference.htmlによると、EXT 接尾辞が付いた MOCKS は「可変引数マクロをサポートしていないコンパイラ」用ですが、私が使用しているものはサポートされています (これらの例で確認してください: http:/ /msdn.microsoft.com/en-us/library/ms177415.aspx )。ドキュメントの残りの部分は、このケースについてあまり明確ではありません。

ここで何が起こっているのか説明できる人はいますか?EXT サフィックス付きの MOCK バージョンを使用しないとエラーが発生するのはなぜですか?

4

2 に答える 2

2

執着者の答えは、可変個引数マクロは C++03 では非標準であるため (ただし、C++11 では標準であるため)、一般に可変個引数マクロに関する保証はないということです。したがって、可変個引数マクロを回避するメソッドがある場合は、可変個引数マクロを使用する代わりに必ずそれを使用する必要があります。

実際には、タートル ライブラリが msc で広範囲にテストされておらず、マクロの非標準 gcc 拡張の 1 つに依存している可能性が非常に高いです。拡張については、Variadic マクロhttp://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.htmlページで説明されています。具体的には、すべての C99 準拠コンパイラでのみタートル ライブラリを移植可能にするため__VA_ARGS__に使用できます。

マクロを使用して、ルート ケースの後にいる場合 - msc の /P スイッチ ( Preprocess to a File ) を使用して、プリプロセッサ ディレクティブが展開されたファイルを生成し.iます。ここで、何が不満なのかを確認できます。

アップデート。この長い話を終えたので、すぐにタートルをダウンロードして、マクロがどのように定義されているかを確認することにしました。そして、私が行ったように、これは単にドキュメントが保守されていないという悲しいケースであることがわかりました. ライブラリ インクルードで grep を実行すると、MOCK_NON_CONST_METHOD定義がまったく見つかりませんでした。そのため、構文エラーが発生しています。マクロを避けるもう 1 つの理由 - C++ エラー メッセージの明確さと健全性。

于 2014-01-31T10:43:37.530 に答える