以下是代码,包括令牌粘贴和字符串化的组合,如下所示:
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
printf("%s\n",h(f(1,2)));
printf("%s\n",g(f(1,2)));
输出结果为:
12
f(1,2)
我不理解两个表达式中排序的差异。
答案 0 :(得分:1)
在预处理器中使用#
表达式时,它接受传入的参数并生成一个字符串。
在您的代码中:
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
printf("%s\n",h(f(1,2)));
printf("%s\n",g(f(1,2)));
当你致电h(f(1,2))
时,它会转换为g(f(1,2))
,而f(1,2)
又是一个宏,因此宏扩展程序会使用{{1从内部开始解析 },即12
,然后将其作为g(12)
传递,结果为"12"
。
使用g(f(1,2))
,f(1,2)
直接使用,因为#a
没有展开,它只使用传入的任何内容a
。