4

为什么在一种情况下嵌套宏有效,而在另一种情况下无效?

情况1:

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

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

案例二:

#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)
4

1 回答 1

4

因为如果宏的参数与 a #or一起出现##在宏主体中(如 in 的情况val) ,则不会扩展宏的参数name。请参阅此问题的已接受答案。

所以在你的第二种情况下,你需要添加一个中间步骤来确保参数被扩展。例如:

#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))
于 2013-03-17T08:07:32.830 回答