[APM32E0] 终于弄明白了enum变量占几个字节的存储空间了

[复制链接]
106|4
风暴之眸 发表于 2025-11-24 17:25 | 显示全部楼层 |阅读模式
在嵌入式软件开发中,enum变量的作用非常明显。在中文翻译中,程序员号编程书多翻译为“枚举变量”,多用来定义声明真值有限,且确定含义的一组集合的变量。由于是真值有限,并且需要自己定义。在我过往的程序设计中enum变量在声明定义时,多数没有超过20个。所以,我一直以为enum变量只占用1个字节。那事实是这样的吗?来,做个实验验证一下!
我们设计一个LED灯的枚举量定义:
typedef enum {
     led_action_off = 0,
     led_action_on,
     led_action_blink,
     led_action_fastblink,
     led_action_breath,
}led_action_e;
再声明一个变量led0,即:
led_action_e led0;
我们可以看到打印出来的数值为1,代表enum类型的led_action_e的占用空间大小为1字节。
enum类型01.jpg
但这是最终结果吗?我们再来编译,并运行一下。结果居然如下:
enum类型02.jpg
这时,可以看到led_action_e的占用空间大小又变成了4字节。两次编译,两次不同的结果。为什么呢?
因为我修改了Keil的编译选项。
enum类型03.jpg
在关闭编译器的Short enums/wchar选项之后,enum变量将统一按照int类型来定义,否则,按照enum定义的数值容量来定义。比如enum的值大于255了,则其将自动扩展为2字节,以此类推。
enum类型在嵌入式软件开发中的作用非常强大,定义enum类型的变量不仅可以实现数值的比较,状态值的定义,而且在代码阅读上面更提供了便利。虽然,在编译器看来,其就是一个整数类型而已。

心跳回响 发表于 2025-11-24 18:34 | 显示全部楼层
看上去,最好还是把enum定义成为固定的int类型4字节,以方便对齐使用。
寂静小夜曲 发表于 2025-11-24 22:37 | 显示全部楼层
这个enum我也一直以为是只占用1字节。这回在结构体里面可要注意了。
记忆花园 发表于 2025-11-25 08:26 | 显示全部楼层
还是通过编译器固定大小处理来得方便。
转瞬回声 发表于 2025-11-25 23:06 | 显示全部楼层
原来这里是关键点啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

50

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0