为什么在Boost Turtle中使用MOCK_NON_CONST_METHOD_EXT作为operator float()?

时间:2014-01-29 09:21:21

标签: c++ boost visual-studio-2013 compiler-construction turtle-mock

我正在使用Boost 1.46和Turtle lib 1.2.4以及Visual Studio Express 2013中的编译器。我有以下类到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)
};

我遇到了大量编译错误,例如语法错误'operator'等。但是当我用MOCK_NON_CONST_METHOD_EXT:

模拟它时
MOCK_BASE_CLASS(MockPredicate, IPredicate)
{
    MOCK_NON_CONST_METHOD_EXT(operator(), 1, bool(float), id)
};

一切都很好,完美无缺!根据{{​​3}}带有EXT后缀的MOCKS用于“不支持可变参数宏的编译器”,但我正在使用的那个支持(使用这些示例检查它:http://turtle.sourceforge.net/turtle/reference.html)。其余文档对此案例并不十分清楚。

有人能够解释我这里的情况是什么吗?当我不使用EXT后缀MOCK版本时为什么会出现错误?

2 个答案:

答案 0 :(得分:2)

Stickler的答案通常是对可变参数宏没有任何保证,因为可变参数宏在C ++ 03中是非标准的(但在C ++ 11中是标准的)。因此,如果你有一个避免可变参数宏的方法,你肯定应该使用它而不是具有可变参数宏的方法。

实际上,虽然很可能没有使用msc对乌龟库进行广泛测试,但只是依赖于宏的非标准gcc扩展之一。这些扩展在Variadic Macros http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html页面上讨论。具体来说,对于所有符合C99标准的编译器都可以移植的海龟库,只能使用__VA_ARGS__

使用宏,当您处于根案例之后 - 使用/ P开关为msc(Preprocess to a File)生成.i文件,其中扩展了预处理器指令,您可以在其中检查什么是它不高兴。

更新。当我完成这个长篇故事时,我决定快速下载乌龟并检查宏的定义方式。正如我所做的那样,我发现这只是一个无法维护文档的悲惨案例。在库上运行grep包括我根本找不到MOCK_NON_CONST_METHOD。这就是你得到语法错误的原因。避免宏的另一个原因 - C ++错误消息的清晰度和健全性。

答案 1 :(得分:1)

(我是乌龟的作者)

1.2.4发生的事情是,由于某种原因,我没有真正调查所提供的代码实际上是1.2.1以及1.2.4文档。 由于没有人抱怨直接在sourceforge上开票,直到很长一段时间才过去(我所有使用乌龟的个人和公司项目都不断与最新的源代码集成)。

无论如何,我刚刚测试了你的代码,它编译了MSVC 2013,turtle 1.2.6和1.55。如果到目前为止您还没有这样做,您应该考虑升级。