问询:无编译器特定扩展、符合C标准的__VA_ARGS__计数(含0参数)实现方案
技术问询:标准C环境下可移植的__VA_ARGS__参数计数实现
问题背景
当前C语言宏开发领域,围绕__VA_ARGS__的参数统计、0参数适配问题已经有大量公开技术提问与讨论(如公开参考问题[1][2]),但现有公开答案普遍存在两类无法满足生产使用要求的缺陷:
- 第一类实现:依赖GCC特有的
##__VA_ARGS__语法消解0参数场景下的多余逗号问题,完全不具备跨编译器可移植性,在严格遵循C标准的非GCC系编译器上会直接触发宏展开语法错误 - 第二类实现:虽严格遵循C语法规范、无专有扩展依赖,但无法兼容0参数场景——此时宏
COUNT_ARGS()(无参数传入)与COUNT_ARGS(something)(单参数传入)的求值结果完全一致,均返回1,无法区分0参数和单参数的调用场景
现存方案的约束矛盾
目前所有公开方案都无法同时满足两个硬性要求:
- 可移植性要求:完全符合ISO C标准,不依赖任何编译器专有扩展,可在所有合规C编译器上正常编译运行
- 功能正确性要求:能够准确统计
__VA_ARGS__内的实际参数数量,覆盖从0个参数到最大支持参数数量的全场景,不存在调用歧义
核心问询
是否存在一种可在所有符合C标准的编译器上正常运行、不依赖任何编译器专有扩展,能够准确统计
__VA_ARGS__内参数数量(包含0个参数场景)的落地实现方案?
内容的提问来源于stack exchange,提问作者Luiz Martins
相关产品推荐
相关产品推荐

