amwox 发表于 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...)是否可行,这种做法可否通用

ffxz 发表于 2011-9-6 10:42:29

需要检查编译器情况

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

unsigned short status;

这样status肯定是对的:-)

aozima 发表于 2011-9-6 10:49:11

enum 一般都用于具体是什么值并不重要的场合,随便定而不要重复.
这样,谁不会真的写6万多行吧.

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

amwox 发表于 2011-9-6 10:59:22

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

198401 发表于 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配置。

mbbill 发表于 2011-9-8 18:40:49

为什么这么麻烦呢

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

typedef unsigned short STATUS_A;
STATUS_A   aStatus;

后面该怎么用还怎么用,不就结了。
页: [1]
查看完整版本: 请帮我测试在枚举型变量的存储问题:枚举变量在存储区域的宽度是多少?