引用维基百科关于枚举类型的文章将是这个问题的最佳开端:
换句话说,枚举类型的值彼此不同,可以比较和分配,但程序员没有指定这些值在计算机内存中具有任何特定的具体表示形式;编译器和解释器可以任意表示它们。
虽然我了解枚举的定义和用法,但我还无法掌握枚举和内存之间的交互——当声明枚举类型而不创建枚举类型变量的实例时,类型定义是作为联合还是结构存储在内存中?上述维基摘录背后的含义是什么?
维基百科摘录并没有专门讨论 C 的enum
类型。C 标准对enum
的工作方式有一些特定的要求。
枚举类型与 char
或某些有符号或无符号整数类型兼容。表示的选择取决于编译器,编译器必须记录其选择(它是实现定义的(,但类型必须能够表示枚举的所有值。
默认情况下,枚举常量的值从 0
开始,对于每个连续常量,以 1
递增:
enum foo {
zero, // equal to 0
one, // equal to 1
two // equal to 2
};
常量总是int
类型,而不管enum
类型本身与什么兼容。(常量是枚举类型更有意义;由于历史原因,它们属于int
类型。
您可以为部分或全部常量指定值 - 这意味着这些值不一定是不同的:
enum bar {
two = 2,
deux = 2,
zwei = 2,
one = 1,
dos // implicitly equal to 2
};
定义枚举类型不会导致在运行时将任何内容存储在内存中。如果定义枚举类型的对象,则该对象的值将存储在内存中(除非对其进行优化(,并将占用 sizeof (enum whatever)
个字节。它与任何其他类型的对象相同。
被视为常量表达式。表达式 two
的处理方式几乎与常数2
相同。
请注意,C++对enum
类型有一些不同的规则。您的问题标记为C,因此我不会详细介绍。
这意味着枚举常量不需要位于内存中。你不能拿走他们的地址。
这允许编译器将对枚举常量的所有引用替换为其实际值。例如,代码:
enum { x = 123; }
int y = x;
可以编译,就好像它是:
int y = 123;
当声明枚举类型而不创建枚举类型变量的实例时,类型定义是作为联合还是结构存储在内存中?
在C语言中,类型大多是编译时构造;一旦程序被编译为机器代码,所有类型信息都会消失*。访问结构成员是"访问此指针的内存 n 字节"。
因此,如果编译器如上所示内联所有枚举,则枚举在编译的代码中根本不存在。
* 调试信息部分除外,但通常仅由调试器读取。