c - 我们可以使用递归宏来创建可变参数最大值/最小值吗?
问题描述
需要具有未知数量参数的最大/最小值,例如:
#define MAX_N(first, second, remain...) MAX_N(((first)>(second)?(first):(second)), ##remain)
在我看来,这不会无限扩展,应该被编译器接受吗?
不幸的是,我必须使用纯 C 而不是 C++。
解决方案
C 2018 6.10.3.4 2 说,关于重新扫描宏替换的结果以获取更多宏:
如果在替换列表的扫描过程中找到被替换的宏的名称(不包括源文件的其余预处理标记),则不会替换它。此外,如果任何嵌套替换遇到被替换的宏的名称,它不会被替换……</p>
因此,递归宏是不可能的,甚至不止两层,更不用说无限多。
通过使用其他宏来扩展宏,可能会导致宏被多次扩展。作为一个简单的例子,after #define X Y Y
,X
将被替换为 的两次出现Y
,如果它是一个已定义的宏,则每一次都将被替换——但单独地,而不是递归地替换。这可以被利用来创建宏,这些宏会导致有限数量的扩展,但无限多的扩展是不可能的。
推荐阅读
- node.js - 仅在预定时间运行 PM2 cron
- javascript - 单击按钮时执行 ng-include - Angularjs
- javascript - 如何为使用 jest 和酶调用另一个函数的函数编写测试?
- spring - 使用 RxJs 和 Angular 5 处理来自 Spring Boot 的服务器发送事件
- android - 选择 MenuItem 时重新创建实际片段
- python - 有多个命令的别名,是否可以将参数传递给第一个命令?
- java - 如何访问WEB-INF下文件夹内的jsp页面?
- c# - 调用字符串方法时出现 ScriptengineException
- .net - 如何使用从 .net 解决方案生成的 AssemblyInfo Patcher 更改 TeamCity 中 DLL 的文件/产品版本?
- typescript - 打字稿:省略“导出”关键字似乎会使界面变得全局?