我试图了解替换same2,same1和concatenate的流程是什么:
#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)));
}
我试图从很多地方理解这一点,但我无法理解。有人可以更清楚地解释吗?
最佳答案
用
#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)节)