C嵌套宏

时间:2013-03-17 07:50:32

标签: c c-preprocessor

为什么在一种情况下嵌套宏可以工作而在另一种情况下不工作?

案例1:

#define name(val) #val
#define name2(front, back) name(front ## back)
...

printf("%s\n", name2(foo, bar));   // foobar

案例2:

#define paste(front, back) front ## back
#define name(val) #val
#define name2(front, back) name(paste(front, back))
...


printf("%s\n", name2(foo, bar));   // paste(foo, bar)

1 个答案:

答案 0 :(得分:4)

因为如果宏的参数与宏体中的###一起显示,则不会展开宏的参数(与valname的情况一样})。请参阅this question的已接受答案。

因此,在第二种情况下,您需要添加一个中间步骤以确保扩展参数。例如。类似的东西:

#define paste(front, back) front ## back
#define name(val) #val
#define expand(val) name(val)  // expand val before stringifying it
#define name2(front, back) expand(paste(front, back))