特定
#define cat(x,y) x##y
Run Code Online (Sandbox Code Playgroud)
调用cat(a,1)返回a1,但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
Run Code Online (Sandbox Code Playgroud)
Clang 给出错误:
test.c:6:11: error: pasting formed ')3', an invalid preprocessing token
int b = cat(cat(1,2),3);
Run Code Online (Sandbox Code Playgroud)
cat(1,2)似乎发生的情况是,编译器在展开后立即将结果包装在括号中;因此,当您调用cat(1,2)代码时,它确实为您提供了(12). 然后,cat((12),3)再次调用会导致((12)3),它不是有效的标记,这会导致编译错误。
普遍的观点是“当使用标记粘贴运算符 (##) 时,您应该使用两级间接”(即使用您的xcat解决方法)。请参阅为什么宏需要双层间接寻址?以及需要将两个标记粘贴在一起的宏应该做什么?。