我试图了解更换same2,same1和连接的流程是什么:
#include<stdio.h>
#define concatenate(a,b) a##b
#define same1(a) #a
#define same2(a) same1(a)
main()
{
printf("%s\n",same2(concatenate(1,2)));
printf("%s\n",same1(concatenate(1,2)));
}
我试图从很多地方理解这一点,但我无法理解。有人可以更清楚地解释一下吗?
答案 0 :(得分:3)
使用
#define concatenate(a,b) a##b
#define same1(a) #a
#define same2(a) same1(a)
当您same2(concatenate(1,2))
时,same2
的参数会在传递给same1
之前展开,因此,concatenate(1,2)
会被其结果12
取代然后由same1
进行字符串化以生成"12"
。
使用same1
时,不会发生宏参数的扩展,因为它前面是字符串化标记#
:
在识别出类似函数的宏的调用参数之后,发生参数替换。替换列表中的参数除非前面有
#
或##
预处理标记或后面跟着##
预处理标记(见下文),否则会在包含所有宏后替换为相应的参数其中有所扩大。在被替换之前,每个参数的预处理标记都被完全宏替换,好像它们形成了预处理文件的其余部分;没有其他预处理令牌可供使用。
(n1570第6.10.3.1(1)节)
答案 1 :(得分:0)
当1和2作为参数传递时,concatinate(a,b)
变为concatinate(1,2)
。反过来变为1##2
,转换为12
,因为##
是一个连接运算符。因此参数1和2连接成12
Same1(a)
变为#a
,其中#
是字符串化运算符(请参阅http://c-faq.com/ansi/stringize.html)。因此,Same1(12)
变为"12"
并打印到控制台
Same2(a)
与Same1(a)
相同,只是#a
,只是按原样输出参数a;所以Same2(a)
的输出,其中参数a是'Concatenate(1,2)'只是一个字符串“Concatenate(1,2)”