这是编译器相关的,可能在枚举类型之间有所不同。以下是语义。
enum X { A, B };
// A has type int
assert(sizeof(A) == sizeof(int));
// some integer type. Maybe even int. This is
// implementation defined.
assert(sizeof(enum X) == sizeof(some_integer_type));
请注意,在C99中,“某些整数类型”可能还包括扩展的整数类型(但是如果提供了这些类型,则实现必须记录)。枚举的类型是一种可以存储任何枚举值的类型(在此示例中为
A
和
B
)。
我认为使用枚举没有任何惩罚。枚举值也是整数常量表达式(因此,您可以使用它来初始化静态或文件作用域变量),并且在我能做到的情况下,我更喜欢它们而不是宏。
枚举器不需要任何运行时内存。只有在创建枚举类型的变量时,才可能使用运行时内存。只需将枚举视为编译时常量即可。
我会使用一个可以存储枚举值的类型(我应该预先知道值的大致范围),将其强制转换并通过网络发送。最好的选择是某种固定宽度的类型,例如
int32_t
,这样在涉及不同计算机时就不会产生冲突。或者,我将打印数字,并在另一侧扫描它,这样可以解决其中的一些问题。
回应编辑的内容:
好吧,编译器不需要使用任何大小。易于看到的一个问题是值的符号很重要-在某些计算中,无符号类型可以显著提高性能。以下是我桌面上GCC
4.4.0
的行为。
int main(void) {
enum X { A = 0 };
enum X a;
unsigned int *p = &a;
}
但是如果你赋值为-1
,那么GCC会选择使用int
作为与X
兼容的类型。
int main(void) {
enum X { A = -1 };
enum X a;
int *p = &a;
}
使用GCC选项--short-enums
,可以使其使用最小的类型来容纳所有的值。
int main() {
enum X { A = 0 };
enum X a;
unsigned char *p = &a;
}
在最新版本的GCC中,编译器标志已更改为-fshort-enums
。在某些目标上,默认类型为unsigned int
。您可以在此处查看答案。