我正在使用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版本时为什么会出现错误?
答案 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。如果到目前为止您还没有这样做,您应该考虑升级。