来自KRC的C编程语言


#define cat(x, y)       x ## y

调用cat(var, 123)会产生var123。但是,电话
cat(cat(1,2),3) undefined :##的存在可防止
扩展外部调用的参数。因此
产生 token 字符串cat ( 1 , 2 )3)3(第一个参数的最后一个标记与
第二个的第一个 token )不是合法 token 。

如果引入了第二级宏定义,
#define xcat(x, y)      cat(x,y)

事情进行得更加顺利; xcat(xcat(1, 2), 3)确实产生
123,因为xcat本身的扩展不涉及
##运算符。
##的属性是什么,这两个示例之间有区别?

为什么第一个示例中的内部cat(1,2)没有扩展,而第二个示例中的内部xcat(1,2)是为什么?

谢谢!

最佳答案

##运算符的一个(鲜为人知的)特征是它禁止进一步扩展其参数(它只是将它们视为纯字符串)。 gcc预处理器文档摘录:

与字符串化一样,实际参数也不是首先进行宏扩展的。

也就是说,##的参数是而不是扩展的。

通过使用xcat宏实现附加的间接寻址,您可以解决此问题(名为prescan的自变量进入其中,并且实际上对结果字符串进行了两次评估)

10-05 23:48