情况1)

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

CONCATENATE(a,CONCATENATE(b,c)) 给出 aCONCATENATE(b,c)。

案例2)
 #define CONCATENATE(x,y) x##y
 #define CONCATENATE2(x,y) CONCATENATE(x,y)

CONCATENATE2(a,CONCATENATE2(b,c)) 给出 abc。

为什么情况 1 不起作用?情况2呢?
请通过分步程序进行解释。

最佳答案

GCC 文档是这样解释的:



(强调)

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

CONCATENATE(a,CONCATENATE(b,c))

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

变成
aCONCATENATE(b,c)

在重新扫描之前,并且没有宏 aCONCATENATE (但如果有,那么它将被扩展)。

另一方面,随着
CONCATENATE2(a,CONCATENATE2(b,c)),

参数 CONCATENATE2(b,c) 不是 ##(或 #)运算符的操作数,因此它在被替换到宏体之前被扩展,最终产生
CONCATENATE(a, bc)

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

关于c - C 预处理器中的嵌套 ## 运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26284393/

10-11 23:03