了解递归宏扩展

时间:2014-05-28 03:31:30

标签: c macros embedded

我在嵌入式采访问题集中遇到了这个问题。

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

x连接到y。但cat(cat(1,2),3)不会扩展,但会提供预处理器警告。为什么呢?

C不鼓励递归宏扩展吗?我的假设是表达式应显示1##2##3。我错了吗?

1 个答案:

答案 0 :(得分:2)

问题在于cat(cat(1,2),3)未按正常方式展开,您希望cat(1,2)提供12cat(12, 3)会提供123

替换列表中##之前或之后的宏参数在替换时不会展开。因此,cat(cat(1,2),3)扩展为cat(1,2)3,由于没有名为cat(1,2)3 的宏,因此无法进一步扩展。 因此,简单的规则是,替换列表取决于##的宏通常不能以嵌套方式调用。