统计 __VA_ARGS__ 参数个数
可变参数宏 __VA_ARGS__ 有个著名的难题:怎么知道参数有几个?预处理器没有循环、没有计数,但利用”占位符平移”技巧可以完美解决。
技巧原理
1 |
关键在参数的错位对齐:
- 传 3 个参数时,展开成
_PrintMacroArgCount("ignored", 1, 2, 3, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) _0吃掉 “ignored”(占位符),_1~`_3吃掉真实参数,XX` 恰好落在 3 上- 传 0 个参数时,
XX落在 0 上,顺便解决了__VA_ARGS__为空时的逗号问题(##__VA_ARGS__会吃掉多余的逗号)
应用:按参数个数生成函数名
配合拼接宏,可以让宏根据参数个数自动选择不同的函数:
1 |
|
这就是 C 语言版的”函数重载”——参数个数不同,自动分发到不同的实现。注意最多支持 10 个参数(占位符只有 10 个位置),需要更多就延长表格。
验证
1 | printf("%d\n", PrintMacroArgCount()); // 0 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 寰宇体的世界!
评论
GiscusTwikoo
