【问题标题】:Understanding recursive Macro Expansions了解递归宏扩展
【发布时间】: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 MacrosStringification
  • 我非常想将其作为C preprocessor and concatenation 的副本关闭,但几乎没有足够的区别,我不想滥用新的神一样的“关闭即重复”我们被赋予的权力。不过,这不需要太多鼓励。
  • 警告正确;您不能将右括号与 3 组合并制作一个标记,并且标记连接必须制作一个标记。
  • @JonathanLeffler 我同意这不是重复的,但一定是某个地方的骗子

标签: c macros embedded


【解决方案1】:

问题是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 的宏,因此无法进一步扩展。
所以简单的规则是,替换列表依赖于## 的宏通常不能以嵌套方式调用。

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多