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

时间:2012-07-23 09:48:06

标签: c macros c-preprocessor stringification

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

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

2 个答案:

答案 0 :(得分:5)

h(f(1,2))

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

g(f(1,2))

f(1,2)代替a。应用于#的{​​{1}}运算符会阻止宏扩展,因此结果实际上是a

答案 1 :(得分:3)

只做替换。

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

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

您还应该看到here