C/C 中的递归宏:神话还是现实?
尽管 C/C 中没有直接递归宏,但存在巧妙的解决方法达到类似递归的效果
使用延迟表达式和间接的递归宏模拟
一种方法涉及使用延迟表达式和间接。通过使用 DEFER 和 EMPTY 宏,我们可以推迟对宏的评估,并防止它被预处理器涂成蓝色。这规避了递归扩展限制。
例如,考虑以下宏:
#define pr_id() pr #define pr(n) ((n==1)? 1 : DEFER(pr_id)()(n-1))
通过利用这个宏,我们获得了以迂回方式递归调用 pr(n) 的能力。然而,这种技术需要多次预处理器扫描才能完成扩展。
通过表达式求值的递归宏
另一种方法涉及利用一系列表达式求值宏,例如 EVAL1 EVAL5,模拟递归行为。
例如,要定义一个递归重复宏,我们可以利用以下语法:
#define REPEAT(count, macro, ...) \ WHEN(count) \ ( \ OBSTRUCT(REPEAT_INDIRECT) () \ ( \ DEC(count), macro, __VA_ARGS__ \ ) \ OBSTRUCT(macro) \ ( \ DEC(count), __VA_ARGS__ \ ) \ )
通过应用多个扩展,我们可以实现类似递归的行为,如以下代码所示:
EVAL(REPEAT(8, M, ~)) // Output: 0 1 2 3 4 5 6 7
代码执行问题
由于 cout 对象使用不当,您问题中提到的代码将不会执行。正确的语法应该是:
cout << "result: " << pr(5) << endl;
替换
替换 和>带有以上是C/C中可以实现递归宏吗?的详细内容。更多信息请关注PHP中文网其他相关文章!