#define的替换和字符串化

时间:2012-10-08 17:06:07

标签: c c-preprocessor stringification

我试图了解更换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)));
}

我试图从很多地方理解这一点,但我无法理解。有人可以更清楚地解释一下吗?

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