3
从C语言程序设计,通过KRC嵌套宏和##
后
#define cat(x, y) x ## y
通话
cat(var, 123)
产量var123
。但是,呼叫cat(cat(1,2),3)
未定义:##
的存在阻止 外部呼叫的参数被扩展。因此它 产生标记字符串cat ( 1 , 2 )3
和)3
(第一个参数的最后一个标记与第二个标记的第一个标记 的连接)不是合法标记。如果引入宏定义的第二级,
#define xcat(x, y) cat(x,y)
事情的工作更加顺利;
xcat(xcat(1, 2), 3)
确实产生123
,因为xcat
本身的扩展本身不涉及##
算子。
##
的性质是什么,使两个例子有所不同?
为什么第一个示例中的内部cat(1,2)
未展开,而第二个示例中的内部xcat(1,2)
是?
谢谢!
感谢。你能解释为什么“通过使用你正在解决问题的xcat宏实现额外的间接寻址”? – Tim
如果“xcat(xcat(1,2),3)确实产生了123”,那么每个“xcat(a,b)”将首先扩展为“cat(a,b)”,然后是'a ## b'。我猜外面的'xcat'首先被扩展,接着是内部的'xcat',所以当第一次出现##时,它将阻止任何进一步的扩展,然后为什么会说“xcat(xcat ),3)产生123“? – Tim