Given
#define cat(x,y) x##y
电话cat(a,1)
回报a1
, but cat(cat(1,2),3)
未定义。
但是如果我也定义#define xcat(x,y) cat(x,y)
,那么结果是xcat(xcat(1,2),3)
就是现在123
。有人可以详细解释一下为什么会这样吗?
我使用 GCC 和 Clang 对此进行了测试。
GCC 给出错误:
test.c:6:1: error: pasting ")" and "3" does not give a valid preprocessing token
Clang 给出错误:
test.c:6:11: error: pasting formed ')3', an invalid preprocessing token
int b = cat(cat(1,2),3);
似乎发生的事情是编译器包装了结果cat(1,2)
一旦展开就放在括号中;所以当你打电话时cat(1,2)
在你的代码中,它确实给了你(12)
。然后,调用cat((12),3)
再次导致((12)3)
,这不是一个有效的标记,这会导致编译错误。
普遍的观点是“当使用标记粘贴运算符 (##) 时,您应该使用两级间接”(即,使用您的xcat
解决方法)。看为什么宏需要双层间接寻址? and 对于需要将两个标记粘贴在一起的宏应该做什么?.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)