C 预处理器中的嵌套 ## 运算符

2024-03-05

Case 1)

#define CONCATENATE(x,y) x##y

连接(a,连接(b,c))给出 aCONCATENATE(b,c).

Case 2)

 #define CONCATENATE(x,y) x##y
 #define CONCATENATE2(x,y) CONCATENATE(x,y)

连接 2(a,连接 2(b,c))给出 abc.

为什么case 1 不起作用?和case 2 does?
请通过逐步过程进行解释。


GCC 文档是这样解释的:

宏参数在使用之前已完全宏扩展 代入宏体,除非它们被串起来或粘贴 与其他代币.

(强调已添加)

另一方面,##(标记粘贴)运算符的操作数在粘贴在一起之前不会进行宏扩展。所以,给定

CONCATENATE(a,CONCATENATE(b,c))

预处理器不扩展CONCATENATE(b,c)在扩展外部宏的主体之前,因为它是 ## 的操作数。相反,预处理器在重新扫描更多宏以展开之前执行标记粘贴,因此

a ## CONCATENATE(b,c)

becomes

aCONCATENATE(b,c)

在重新扫描之前,并且没有宏 CONCATENATE (但如果有的话,那么it将会被扩展)。

另一方面,与

CONCATENATE2(a,CONCATENATE2(b,c)),

论证CONCATENATE2(b,c)不是 ##(或 #)运算符的操作数,因此在代入宏体之前对其进行扩展,最终产生

CONCATENATE(a, bc)

作为外部宏的第一个扩展。重新扫描以进一步扩展,产生

abc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 预处理器中的嵌套 ## 运算符 的相关文章

随机推荐