我正在使用32K内存的嵌入式设备,使用IAR EWARM v6.30的纯C语言编写。
为了使代码更易读,我想定义一些枚举类型,例如:
{RIGHT_BUTTON, CENTER_BUTTON, LEFT_BUTTON}
我不想使用0、1、2这样的值,但我担心会占用已经很少的额外内存。
所以我有两个问题: 1)我能强制枚举为short或byte类型而不是int类型吗? 2)定义枚举类型的确切内存印记是什么?
signed int
类型。为了优化或扩展,一些嵌入式系统编译器故意不遵守这个标准。--enum_is_int
来强制执行符合规范的行为。其他编译器可能会有不同的行为或不同的扩展、预处理指令或选项来控制此行为。这些内容通常在文档中定义。char
中,那么你可以使用一组 #define
常量值来表示 enum
状态,并且只在赋值和测试中使用这些值。int
类型(等同于signed int
)。但是这些常量通常不会存储在内存中,因此它们的类型可能不会对内存需求产生太大影响。char
或某些带符号或无符号整数类型兼容。类型的选择是实现定义的(即编译器可以选择,但必须记录如何进行选择);唯一要求是该类型必须能够存储所有常量的值。int
而不是枚举类型,但这就是语言的定义方式(原因是历史原因,C++有不同的规则)。enum foo { x, y, z };
enum foo obj;
obj = z;
z
的类型为 int
,且其值为2(就像十进制常量2
一样),但对象obj
的类型为enum foo
,具体大小取决于编译器,可能只有一个字节。赋值语句 obj = z;
包含从 int
到 enum foo
的隐式转换(这种转换可能需要额外的代码)。
一些编译器可能提供一些非标准的方式来指定枚举类型的选择类型。有些甚至可能以某种方式违反标准。请参阅您编译器的文档,打印出 sizeof(enum foo)
的值,并在必要时检查生成的代码。
很可能您的编译器会在语言规定的限制下做出合理的决策。对于面向内存较少的嵌入式系统的编译器,特别是可能会选择较小的类型,或者让您指定一个。请查看您编译器的文档。
正如Ian的回答所示,如果您想要自己控制内存使用,可以使用char
或unsigned char
对象。不过,您仍然可以使用enum
定义来定义常量。例如:enum { x, y, z }; // No tag, so you can't declare objects of this type
typedef unsigned char foo; // an enum_foo object is guaranteed to be 1 byte
foo obj = z;
ANSI C编译器将始终将枚举表示为int
,以表示enum
类型的变量。
http://en.wikipedia.org/wiki/Enumerated_type#C_and_syntactically_similar_languages
在您的程序中使用 int
的一种选项是将其用于定义值,但在实际使用时转换为 char
char value = (char)Buttons.RIGHT_BUTTON;