【发布时间】:2014-05-28 03:31:30
【问题描述】:
我在嵌入式面试问题集中遇到了这个问题。
#define cat(x,y) x##y
将x 连接到y。但cat(cat(1,2),3) 不会扩展,但会发出预处理器警告。为什么?
C 不鼓励递归宏扩展吗?我的假设是表达式应该显示1##2##3。我错了吗?
【问题讨论】:
-
递归扩展只对一层有效。见这里:Self Referencial Macros 和 Stringification
-
我非常想将其作为C preprocessor and concatenation 的副本关闭,但几乎没有足够的区别,我不想滥用新的神一样的“关闭即重复”我们被赋予的权力。不过,这不需要太多鼓励。
-
警告正确;您不能将右括号与 3 组合并制作一个标记,并且标记连接必须制作一个标记。
-
@JonathanLeffler 我同意这不是重复的,但一定是某个地方的骗子