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 12
或f(1,2) f(1,2)
。
h(f(1,2))
f(1,2)
代替a
。 a
不是#
或##
运算符的主题,因此它扩展为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)"
你也应该看到这里 。