7

C 标准给出了以下示例:

#define hash_hash # ## #
#define mkstr(a) # a
#define in_between(a) mkstr(a)
#define join(c, d) in_between(c hash_hash d)
char p[] = join(x, y); // equivalent to char p[] = "x ## y";

但它也说“未指定 # 和 ## 运算符的评估顺序。”

为什么hash_hash保证的扩展被解释为应用于#的##运算符,而不是应用于##的#运算符?

4

2 回答 2

3

因为 '#' 仅在出现在类似函数的宏中并且后跟参数名称时才充当运算符...但是 hash_hash 不是类似函数的宏并且那些 '#' 后面没有参数名称.

于 2013-01-18T09:50:15.693 回答
0

引用 C99:

标点符号是具有独立句法和语义意义的符号。根据上下文,它可以指定要执行的操作(这反过来可能会产生一个值或函数指示符,产生副作用或它们的某种组合)在这种情况下,它被称为运算符(其他形式的运算符也在某些情况下存在)。操作数是操作员作用的实体。

#并且##是标点符号。

除了 :

6.10.3.1 参数替换

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

于 2013-01-18T09:46:47.307 回答