Google上的每个引用只显示简单的示例,我在代码中有这种情况:
#define XHANDLER(A,B,H) X_TO_BUS_HANDLER(A,B,H) X_FROM_BUS_HANDLER(A,B,H)
namespace{
X_TO_BUS_HANDLER( some::SomeClassX,
bus::SomeBus,
foo::SomeHandler );
有人知道这个定义是如何工作的吗?一种模式和两种令牌列表?请参考。
我egrepED代码,但只找到了X_TO_BUS_HANDLER。
答案 0 :(得分:6)
它的工作方式与其他任何定义一样 - 只要预处理器遇到XHANDLER
,它就会用X_TO_BUS_HANDLER(A,B,H) X_FROM_BUS_HANDLER(A,B,H)
(和参数)替换它。
在您的代码段中,未使用该宏。
但是像
XHANDLER(some::SomeClassX, bus::SomeBus, foo::SomeHandler)
等同于
X_TO_BUS_HANDLER(some::SomeClassX, bus::SomeBus, foo::SomeHandler) X_FROM_BUS_HANDLER(some::SomeClassX, bus::SomeBus, foo::SomeHandler)
答案 1 :(得分:5)
请记住,预处理器只是用它们的主体替换宏。所以使用宏
XHANDLER(a, b, c)
简单地替换为文本
X_TO_BUS_HANDLER(a, b, c) X_FROM_BUS_HANDLER(a, b, c)
答案 2 :(得分:2)
C / C ++预处理器将替换在同一行中写入的所有内容的模式。在你的情况下,看起来该模式后面的两个标记本身就是宏,所以它们也会被扩展。
一些例子:
#define F(x, y) x f(y yParam);
#define G(x, y) y g(x xParam);
#define FG(x, y) F(x, y) G(x, y);
FG(int, double)
//this is the same as:
int f(double yParam);
double g(int xParam);
在你的情况下,我猜这两个定义X_FROM _...和X_TO _...创建一些函数或类,它们分别是从一个总线传递X到一些总线的处理程序。 XHANDLER宏将为两个方向创建处理程序。