2012-11-22 48 views
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已被使用。

回答

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宏将为创建处理程序,这两个方向均为

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) 
+0

所以这是一种同时填充两种方式? Nice ... –

5

记住,预处理只是替换宏与自己的身体。所以宏观

XHANDLER(a, b, c) 

的使用仅仅通过文字

X_TO_BUS_HANDLER(a, b, c) X_FROM_BUS_HANDLER(a, b, c) 
+0

除非X_TO_BUS_HANDLER和X_FROM_BUS_HANDLER不仅仅是文本而是宏本身,那么它们也会被扩展;) –