为什么要在Boost Turtle中使用MOCK_NON_CONST_METHOD_EXT用于操作员float()
Why to use MOCK_NON_CONST_METHOD_EXT for operator float() in Boost Turtle?
我正在使用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编译。如果您还没有这样做,则应考虑升级。
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 通过 get-Method 访问变量在类外不起作用
- 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- 如何在 c++ 中理解这样的代码 [request->headers().Method()->value().getStringView())]
- g++ [[noreturn]] on a virtual method
- 错误"pure virtual method called",当此方法已被覆盖时
- 如何修复此错误? "Method 'str' could not be resolved"
- 致命错误:使用 OpenCV 2.4.11 找不到"ext/atomicity.h"文件
- 使用 -march 编译会导致线程说"pure virtual method called"
- QMetaObject::invokeMethod: no such method QTextCursor::MoveO
- ":"(单个冒号)在"Klass:method(p)"中是什么意思?
- LuaJIT 和 C++ - 调用 Table.Method() 在 loadstring/pcall 中不起作用
- 如何在源文件中定义类并将其声明在标题文件中(而不必使用`class :: method'语法定义类方法)
- C++ 使用 .chain().method() 链接成员函数 vers ->chained(0->method()
- OpenCV InputArray and getMat method
- Eclipse "implement method"函数不适用于模板类
- Typedef for static method
- cuda convnet equvilent method from opencv gpu::convolve
- (*it)->method() vs (**it).method
- std::stringstream and the str method