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

32位ARM MCU下GCC编译时sizeof(enum)结果不符合预期如何解决

问题原因

ARM架构下的GCC编译器默认开启-fshort-enums编译选项,该选项不会强制枚举类型固定为int,而是会根据枚举成员的取值范围,选择能容纳所有成员值的最小整数类型:

  • 你定义的三个枚举成员最大值分别为2、11、100,均未超过uint8_t的取值上限255,所以三个枚举的大小都是1字节
  • 32位ARM架构下int的大小为4字节,因此sizeof对比不相等,函数返回0
解决方案

根据你的需求二选一即可:

方案1:保留现有测试条件(要求枚举类型为int),修改枚举定义或编译配置

  • 方式1:给枚举添加一个取值为INT_MAX的占位成员,强制编译器选用int类型存储枚举,示例:
enum smallchoices { sa, sb, sc, _force_int = INT_MAX };

三个枚举都按此修改即可。

  • 方式2:修改编译参数,添加-fno-short-enums选项,全局关闭短枚举优化,所有枚举都会默认使用int类型,无需修改代码。

方案2:保留现有枚举定义,修改测试条件

如果你的项目确实需要启用-fshort-enums优化,就修改测试逻辑,匹配对应枚举的实际大小即可:

if (!TEST_size_t_eq(sizeof(enum smallchoices), sizeof(uint8_t))
    || !TEST_size_t_eq(sizeof(enum medchoices), sizeof(uint8_t))
    || !TEST_size_t_eq(sizeof(enum largechoices), sizeof(uint8_t)))
    return 0;

该方案兼容性差,后续枚举成员数量超过255时需要同步修改测试条件,不推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:36:00