C预处理:stringize宏观和身份宏(C preprocessor: stringize mac

2019-06-26 11:15发布

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

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

Answer 1:

h(f(1,2))

f(1,2)代入aa不是主题###运算符,所以它扩大到12 。 现在你有g(12)这将扩展为"12"

g(f(1,2))

f(1,2)代入a 。 的#施加到操作者a防止宏扩展,所以结果是字面上"f(1,2)"



Answer 2:

只是做了更换。

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

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

你也应该看到在这里 。



文章来源: C preprocessor: stringize macro and identity macro