来自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的自变量进入其中,并且实际上对结果字符串进行了两次评估)