首页 > 解决方案 > 我们可以使用递归宏来创建可变参数最大值/最小值吗?

问题描述

需要具有未知数量参数的最大/最小值,例如:

#define MAX_N(first, second, remain...) MAX_N(((first)>(second)?(first):(second)), ##remain)

在我看来,这不会无限扩展,应该被编译器接受吗?

不幸的是,我必须使用纯 C 而不是 C++。

标签: cmacros

解决方案


C 2018 6.10.3.4 2 说,关于重新扫描宏替换的结果以获取更多宏:

如果在替换列表的扫描过程中找到被替换的宏的名称(不包括源文件的其余预处理标记),则不会替换它。此外,如果任何嵌套替换遇到被替换的宏的名称,它不会被替换……</p>

因此,递归宏是不可能的,甚至不止两层,更不用说无限多。

通过使用其他宏来扩展宏,可能会导致宏被多次扩展。作为一个简单的例子,after #define X Y Y,X将被替换为 的两次出现Y,如果它是一个已定义的宏,则每一次都将被替换——但单独地,而不是递归地替换。这可以被利用来创建宏,这些宏会导致有限数量的扩展,但无限多的扩展是不可能的。


推荐阅读