我在嵌入式采访问题集中遇到了这个问题。
#define cat(x,y) x##y
将x
连接到y
。但cat(cat(1,2),3)
不会扩展,但会提供预处理器警告。为什么呢?
C不鼓励递归宏扩展吗?我的假设是表达式应显示1##2##3
。我错了吗?
答案 0 :(得分:2)
问题在于cat(cat(1,2),3)
未按正常方式展开,您希望cat(1,2)
提供12
而cat(12, 3)
会提供123
。
替换列表中##
之前或之后的宏参数在替换时不会展开。因此,cat(cat(1,2),3)
扩展为cat(1,2)3
,由于没有名为cat(1,2)3
的宏,因此无法进一步扩展。
因此,简单的规则是,替换列表取决于##
的宏通常不能以嵌套方式调用。