以下是包含 Token paste 和 Stringizing 组合的代码,如下所示:
#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)
我不理解这两个表达式中排序的区别。
以下是包含 Token paste 和 Stringizing 组合的代码,如下所示:
#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)
我不理解这两个表达式中排序的区别。
当您#
在预处理器中使用表达式时,它会接受传入的参数并生成一个字符串。
在您的代码中:
#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)
即12
,然后将其传递为g(12)
,从而产生"12"
.
with g(f(1,2))
,f(1,2)
直接使用,因为 with 没有扩展#a
,它只是使用传入的任何内容 as a
。