3

我试图了解在以下位置替换 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)));
}

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

4

2 回答 2

3

#define concatenate(a,b) a##b
#define same1(a)  #a
#define same2(a)  same1(a)

当你有 时same2(concatenate(1,2)),参数 ofsame2在传递给它之前被扩展same1,所以在那里,concatenate(1,2)被它的结果替换12,然后被字符串化为same1产生"12"

使用same1,不会发生宏参数的扩展,因为它前面是字符串化标记#

在确定了调用类函数宏的参数后,将进行参数替换。替换列表中的参数,除非前面有一个###预处理标记或后面有一个##预处理标记(见下文),在其中包含的所有宏都已展开后,将被相应的参数替换。在被替换之前,每个参数的预处理标记都被完全宏替换,就好像它们形成了预处理文件的其余部分一样;没有其他可用的预处理令牌。

(n1570 中的第 6.10.3.1 (1) 节)

于 2012-10-08T18:21:35.063 回答
0

当 1 和 2 作为参数传递时,您concatinate(a,b)就变成了。concatinate(1,2)那又变成1##2了 which 转化为12because##是一个连接运算符。所以参数 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)"

于 2012-10-08T17:19:46.900 回答