C预处理器:stringize宏和身份宏

我想知道这段代码输出背后的原因。 我无法想出答案。

#define f(a,b) a##b #define g(a) #a #define h(a) g(a) void main() { printf("%s %s",h(f(1,2)),g(f(1,2))); } 

PS:输出为12 f(1,2) 。 我以为它是12 12f(1,2) f(1,2)

 h(f(1,2)) 

f(1,2)代替aa不是###运算符的主题,因此它扩展为12 。 现在你有g(12)扩展为"12"

 g(f(1,2)) 

f(1,2)代替a 。 应用于#运算符可以防止宏扩展,因此结果实际上是"f(1,2)"

只是做替换。

 h(f(1, 2)) -> g(12) -> "12" g(f(1,2)) -> "f(1, 2)" 

你也应该看到这里 。