令牌粘贴和字符串组合

时间:2013-06-17 10:51:35

标签: c c-preprocessor

以下是代码,包括令牌粘贴和字符串化的组合,如下所示:

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

我不理解两个表达式中排序的差异。

1 个答案:

答案 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