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) 时,会发生以下步骤:
递归重复宏
类似递归的宏的一个更复杂的示例是重复宏,它执行特定的操作代码块指定次数:
#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中文网其他相关文章!