2010-03-11 137 views
29

你能用这样一个宏吗?CC预处理器宏定义宏

#define SUPERMACRO(X,Y) #define X Y 

then 

SUPERMACRO(A,B) expands to #define A B 

我有一种感觉,不是因为预处理器只有一次通过。

官方gcc只。请不要使用第三方工具。

回答

23

宏无法扩展为预处理指令。从C99 6.10.3.4/3“重新扫描和再替换”:

所得完全宏取代预处理标记序列不被处理,即使它类似于一个预处理指令,

2

对不起,你不能。您可以在宏中调用其他宏,但不能定义新宏。

+0

如果您执行了预处理器的2次通过,那么该怎么办? – pm100 2010-03-11 23:39:28

+1

语法无效。 #在宏中是一种保留字符。 #必须跟一个宏参数才有效。这将'串化'参数。 – 2010-03-12 00:31:18

3

号操作顺序是这样的:所有预处理器指令在任何宏扩展完成之前都被识别;因此,如果一个宏扩展成看起来像预处理器指令的东西,它将不会被识别,但会被解释为(错误的)C源文本。

12

您不能在其他宏中定义宏,但可以从宏调用宏,这可以得到基本相同的结果。

#define B(x) do {printf("%d", (x)) }while(0) 
#define A(x) B(x) 

因此,A(y)扩大到do {printf("%d", (y)) }while(0)

0

你可以尝试只用预处理选项运行事情的经过,然后用处理后的文件进行编译。

0

你可以做到这一点,但: 的#define SUPERMACRO(X,Y)定义X Y

然后你可以使用你的编辑宏扩展功能,并粘贴缺少#。

甚至更​​好:使用不同的更强大的字符串处理语言作为预处理器。