搜索
bottom↓
回复: 5

请帮我测试在枚举型变量的存储问题:枚举变量在存储区域的宽度是多少?

[复制链接]

出0入0汤圆

发表于 2011-9-6 10:37:33 | 显示全部楼层 |阅读模式
枚举变量在存储区域的宽度是多少?1个字节?2个字节?4个字节?
我们自已的枚举量很少定义到需要4个字节去存储,而有时确实需固定枚举量的宽度(比如在通信协议,文件存储之类的地方).
试行方法:
typedef enum {
    STATUS_0 = 0,
    STATUS_1 = 1,
    STATUS_2 = 2,
    //其它状态请在这之前插入
    STATUS_FORCE_WORD = 0xFFFF,//如果是0x10000,应该是4个字节
}STATUS_A;
STATUS_A   aStatus;   //在内存中的存储宽度为2字节
我试过在ARM7+KEIL的平台下,只要枚举量没有超出64K的范围是有效的.
现在想确认的是在其它平台下(CM3+IAR,X86+VS...)是否可行,这种做法可否通用

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-9-6 10:42:29 | 显示全部楼层
需要检查编译器情况

如果要通用,就:
#define STATUS_0 0
...
#define ...

unsigned short status;

这样status肯定是对的:-)

出0入0汤圆

发表于 2011-9-6 10:49:11 | 显示全部楼层
enum 一般都用于具体是什么值并不重要的场合,随便定而不要重复.
这样,谁不会真的写6万多行吧.

而如果用define就杯具了,改一个,其它的都可能要改.
大部分的编译器 enum可以设定的.
但一般,最好是要让程序在不需要动任何编译器的设置的情况下就能正常工作.

出0入0汤圆

 楼主| 发表于 2011-9-6 10:59:22 | 显示全部楼层
用#define也可以达到目,但它没有enum的一个优点,第一个赋值后,后续的自动加1,如果需要在某一处插入几个量,用define修改时变得很不爽了,而用enum就变得很简单了.虽然也可以在尾部增加,但是这做法不适用于所有的情况.

出0入0汤圆

发表于 2011-9-8 16:04:23 | 显示全部楼层
Enum Container always int
When disabled, the data type container for enum is optimize according the value range. When enabled, the data type container for enum is always signed int.

RealView MDK-ARM 的enum配置。

出0入0汤圆

发表于 2011-9-8 18:40:49 | 显示全部楼层
为什么这么麻烦呢

enum {
    STATUS_0 = 0,
    STATUS_1 = 1,
    STATUS_2 = 2,
};

typedef unsigned short STATUS_A;
STATUS_A   aStatus;

后面该怎么用还怎么用,不就结了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 20:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表