#define在模式后面有两个标记

时间:2012-11-22 14:03:00

标签: c++ macros c-preprocessor

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。

3 个答案:

答案 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宏将为两个方向创建处理程序。