首页 >后端开发 >C++ >如何用 C/C 宏模拟递归?

如何用 C/C 宏模拟递归?

Linda Hamilton
Linda Hamilton原创
2024-12-07 08:53:11993浏览

How Can Recursion Be Emulated with C/C   Macros?

C/C 中的递归宏

C/C 中的宏不支持直接递归。但是,可以通过预处理技术和间接的组合来模拟递归。

类似递归的宏示例

以下宏使用延迟表达式模拟递归和间接:

#define EMPTY(...)
#define DEFER(...) __VA_ARGS__ EMPTY()
#define OBSTRUCT(...) __VA_ARGS__ DEFER(EMPTY)()
#define EXPAND(...) __VA_ARGS__

#define pr_id() pr
#define pr(n) ((n == 1) ? 1 : DEFER(pr_id)()(n - 1))

执行处理

当遇到 pr(5) 时,会发生以下步骤:

  1. pr(5) 展开为 ((5 == 1) ? 1 : DEFER( pr_id)()(5 - 1)).
  2. 预处理器将 pr(5) 绘制为蓝色(禁用context),防止其进一步扩展。
  3. DEFER(pr_id)()(5 - 1) 变为 OBSTRUCT(pr_id)()(5 - 1) 并且 pr_id () 被涂成蓝色。
  4. EXPAND(pr(5)) 展开为 ((5 == 1) ? 1 : ((5 - 1 == 1) ? 1 : DEFER(pr_id)()(5 - 1 - 1)))
  5. 需要额外的扩展才能完成递归。

递归重复宏

类似递归的宏的一个更复杂的示例是重复宏,它执行特定的操作代码块指定次数:

#define REPEAT(count, macro, ...) \
    WHEN(count) \
    ( \
        OBSTRUCT(REPEAT_INDIRECT) () \
        ( \
            DEC(count), macro, __VA_ARGS__ \
        ) \
        OBSTRUCT(macro) \
        ( \
            DEC(count), __VA_ARGS__ \
        ) \
    )
#define REPEAT_INDIRECT() REPEAT

#define M(i, _) i

此宏可以按如下方式使用:

EVAL(REPEAT(8, M, ~)) // 0 1 2 3 4 5 6 7

限制

模拟递归时通过宏是可能的,但由于潜在的性能影响和代码可读性问题,通常被认为是一种不好的做法。现代 C 提供了替代的递归机制,例如 lambda 表达式和模板元编程。

以上是如何用 C/C 宏模拟递归?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn