C 嵌套宏

Geo*_*kov 6 c c-preprocessor

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

情况1:

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

printf("%s\n", name2(foo, bar));   // foobar
Run Code Online (Sandbox Code Playgroud)

案例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)
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 6

#因为如果宏的参数与 a或一起出现##在宏主体中(就像valin的情况) ,则宏的参数不会扩展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))
Run Code Online (Sandbox Code Playgroud)