为什么在一种情况下嵌套宏有效而在另一种情况下无效?
情况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)
最佳答案
因为如果宏的参数与 #
一起出现,则它们不会被扩展。或 ##
在宏体中(与 val
中的 name
的情况一样)。请参阅 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))
关于C 嵌套宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458649/