You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用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;
}

工作原理

  1. sizeof_types(...)接收任意数量的类型参数,直接转发给_SIZ_SUM宏
  2. _SIZ_SUM每次取出第一个类型,计算sizeof(t),再通过_SIZ_SUM_HELPER把剩余参数拼接到_SIZ_SUM后,发起新的递归调用
  3. 当所有参数处理完毕后,会触发_SIZ_SUM()终止宏,返回0结束递归,最终得到所有sizeof值的总和

注意事项

  • 传入的参数必须是合法的C类型(如int、double、自定义结构体等),不能是变量或表达式
  • sizeof的返回值类型是size_t,打印时需使用%zu格式符(而非%d),避免类型不匹配导致的输出错误
  • 该实现依赖预处理器的宏拼接(##)特性,属于标准C语法,无需额外依赖

内容的提问来源于stack exchange,提问作者Will Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 22:12:36