【问题标题】:Why to use MOCK_NON_CONST_METHOD_EXT for operator float() in Boost Turtle?为什么在 Boost Turtle 中使用 MOCK_NON_CONST_METHOD_EXT 作为运算符 float()?
【发布时间】:2014-01-29 09:21:20
【问题描述】:

我正在使用带有 Turtle lib 1.2.4 的 Boost 1.46 和 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)
};

一切正常,完美运行!根据 http://turtle.sourceforge.net/turtle/reference.html 带有 EXT 后缀的 MOCKS 用于“不支持可变参数宏的编译器”,但我使用的那个支持(通过这些示例进行检查:http://msdn.microsoft.com/en-us/library/ms177415.aspx)。文档的其余部分对这个案例并不是很清楚。

有人能解释一下这里的情况吗?为什么我不使用EXT后缀的MOCK版本会报错?

【问题讨论】:

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


    【解决方案1】:

    坚持者的回答是,通常不保证可变参数宏,因为可变参数宏在 C++03 中是非标准的(但在 C++11 中是标准的)。因此,如果您有一种方法可以避免使用可变参数宏,那么您绝对应该使用它来代替带有可变参数宏的方法。

    实际上,turtle 库很可能没有经过 msc 的广泛测试,而只是依赖于宏的非标准 gcc 扩展之一。扩展在 Variadic Macros http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html 页面上进行了讨论。具体来说,为了让所有符合 C99 的编译器都可移植 turtle 库,只能使用 __VA_ARGS__。

    使用宏,当您在根案例之后 - 使用 msc (Preprocess to a File) 的 /P 开关来生成一个扩展了预处理器指令的 .i 文件,您可以在其中检查它的不满意之处。

    更新。当我完成了这个漫长的故事后,我决定快速下载海龟并检查宏是如何定义的。正如我所做的那样,我发现这只是文档未维护的可悲案例。在库上运行 grep 包括我根本找不到 MOCK_NON_CONST_METHOD 定义。这就是您收到语法错误的原因。避免使用宏的另一个原因 - C++ 错误消息的清晰性和完整性。

    【讨论】:

      【解决方案2】:

      (我是乌龟的作者)

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

      无论如何,我刚刚测试了您的代码,它可以使用 MSVC 2013、turtle 1.2.6 和 boost 1.55 进行编译。如果您当时还没有这样做,您应该考虑升级。

      【讨论】:

        猜你喜欢
        • 2014-08-07
        • 1970-01-01
        • 1970-01-01
        • 2011-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-03
        • 1970-01-01
        相关资源
        最近更新 更多