1

以下是包含 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)

我不理解这两个表达式中排序的区别。

4

1 回答 1

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)12,然后将其传递为g(12),从而产生"12".

with g(f(1,2)),f(1,2)直接使用,因为 with 没有扩展#a,它只是使用传入的任何内容 as a

于 2013-06-17T11:04:20.803 回答