能否用C宏接收任意基本类型列表并计算其sizeof总和?
实现接收任意数量类型的sizeof求和宏
完全可以实现这个需求,利用C的可变参数宏和预处理器递归展开技巧,就能让宏接收任意数量的类型参数,在编译期计算它们的sizeof总和。
兼容C99的通用实现方案
以下代码可在GCC、Clang、MSVC等主流编译器中正常运行:
#include <stdio.h> // 递归终止宏:无参数时返回0 #define _SIZ_SUM() 0 // 核心递归宏:取出第一个类型计算sizeof,再处理剩余参数 #define _SIZ_SUM(t, ...) sizeof(t) + _SIZ_SUM_HELPER(__VA_ARGS__) // 辅助宏:将剩余参数拼接到递归宏后,实现参数遍历 #define _SIZ_SUM_HELPER(...) _SIZ_SUM##__VA_ARGS__ // 对外暴露的调用宏 #define sizeof_types(...) _SIZ_SUM(__VA_ARGS__) int main() { // 测试用例 printf("int + int + double: %zu\n", sizeof_types(int, int, double)); // 输出16 printf("int + char: %zu\n", sizeof_types(int, char)); // 输出5 printf("float ×3: %zu\n", sizeof_types(float, float, float)); // 输出12 return 0; }
工作原理
sizeof_types(...)接收任意数量的类型参数,直接转发给_SIZ_SUM宏_SIZ_SUM每次取出第一个类型,计算sizeof(t),再通过_SIZ_SUM_HELPER把剩余参数拼接到_SIZ_SUM后,发起新的递归调用- 当所有参数处理完毕后,会触发
_SIZ_SUM()终止宏,返回0结束递归,最终得到所有sizeof值的总和
注意事项
- 传入的参数必须是合法的C类型(如
int、double、自定义结构体等),不能是变量或表达式 sizeof的返回值类型是size_t,打印时需使用%zu格式符(而非%d),避免类型不匹配导致的输出错误- 该实现依赖预处理器的宏拼接(
##)特性,属于标准C语法,无需额外依赖
内容的提问来源于stack exchange,提问作者Will Martin
相关产品推荐
相关产品推荐

