首页 > 后端开发 > C++ > 我们可以在 C/C 预处理中创建递归宏吗?

我们可以在 C/C 预处理中创建递归宏吗?

Barbara Streisand
发布: 2024-12-09 11:47:16
原创
188 人浏览过

Can We Create Recursive Macros in C/C   Preprocessing?

我们可以有递归宏吗?

虽然宏不直接递归扩展,但有一些巧妙的技术可以实现类似的功能。

解决方法递归宏

我们可以使用延迟表达式和间接来防止预处理器在扩展期间禁用宏。以下是创建递归 pr 宏的示例:

#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) -> ((5==1)? 1 : pr_id()(4))
EXPAND(pr(5)) -> ((5==1)? 1 : ((4==1)? 1 : pr_id()(3)))
登录后复制

递归重复宏的示例

使用这些技术,我们可以创建一个递归 REPEAT宏:

#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/C 预处理中创建递归宏吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板