4

谷歌上的每一个参考都只显示了简单的例子,我在代码上有这个案例:

#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 被使用了。

4

3 回答 3

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)
于 2012-11-22T14:05:42.690 回答
5

请记住,预处理器只是用它们的主体替换宏。所以宏的使用

XHANDLER(a, b, c)

只是被文本替换

X_TO_BUS_HANDLER(a, b, c) X_FROM_BUS_HANDLER(a, b, c)
于 2012-11-22T14:05:45.487 回答
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 宏将为两个方向创建处理程序。

于 2012-11-22T14:18:14.073 回答