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
相关产品推荐
相关产品推荐

