我试图了解替换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)节)

08-16 09:19