为什么要在Boost Turtle中使用MOCK_NON_CONST_METHOD_EXT用于操作员float()

Why to use MOCK_NON_CONST_METHOD_EXT for operator float() in Boost Turtle?

本文关键字:EXT METHOD CONST 用于 操作员 float NON 为什么 Turtle Boost MOCK      更新时间:2023-10-16

我正在使用boost 1.46与Turtle Lib 1.2.4和Visual Studio Express 2013的编译器。我有以下类要模拟:

struct IPredicate
{
    virtual ~IPredicate() {}
    virtual bool operator()(float value) = 0;
};

当我用mock_non_const_method模拟操作员()时:

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后缀模拟的,用于"不支持variadic Macros"的"编译器",但我使用的一个支持(检查了这些示例:http:/http:/http:/http://sdn.microsoft.com/en-us/library/ms177415.aspx)。其余文档对此情况并不清楚。

有人可以向我解释一下这里是什么情况吗?为什么不使用Ext后缀模拟版本时会出现错误?

Stickler的答案是,通常没有关于variadic宏的保证,因为variadic宏在C 03中是非标准的(但在C 中是标准的)。因此,如果您有一种避开variadic宏的方法,则绝对应该使用它,而不是具有variadic宏的方法。

实际上,尽管乌龟库很可能没有通过MSC进行广泛的测试,而只是依靠宏的非标准GCC扩展名之一。在variadic宏http://gcc.gnu.org/onlinedocs/cpp/variadic-macros.html页面上讨论了扩展。具体而言,要使乌龟库适用于所有C99一致编译器的便携式,只能使用__VA_ARGS__

使用宏,当您追随根案例时 - 使用/p开关用于MSC(预处理到文件),以扩展使用预处理器指令的情况下生成.i文件,您可以在其中检查它不快乐的内容。<<<<<<<<<<<<<<<<<<<<<<<<

更新。我完成了这个长篇小说时,我决定快速下载乌龟并检查如何定义宏。就像我所做的那样,我发现这只是一个不太好的文档的可悲案例。在库上运行GREP包括我找不到MOCK_NON_CONST_METHOD的定义。这就是为什么您会遇到语法错误。避免宏的另一个原因 - C 错误消息的清晰度和理智。

(我是乌龟的作者)

1.2.4发生的事情是因为我没有真正调查提供的代码实际上是1.2.1,以及1.2.4文档。由于没有人直接在SourceForge上打开票,直到已经过去了很长时间(我使用Turtle的所有个人和公司项目都不断与最新的源代码集成在一起)。

)。

无论如何,我刚刚测试了您的代码,并使用MSVC 2013,Turtle 1.2.6和Boost 1.55编译。如果您还没有这样做,则应考虑升级。