- 枚举是“命名的常量集合”:
enum MyType_e {A, B, C};
- 这些常量在枚举的父范围内声明,即如果枚举在文件范围内声明,并且未命名,则相当于一系列 eg
#define A 0
语句 - 枚举常量的底层类型总是
int
ieint var = A
是完全合法的,虽然var
不是类型MyType_e
那么枚举名称的作用是什么?
编辑 根据下面的评论,我对枚举的理解似乎有很大缺陷。枚举与#define 语句无关。 枚举在编译时被解析,并被输入。
使用enum
类型传达意图。
假设您有一个将enum
常量作为参数的函数。
void foo(enum MyType_e e);
是关于什么是有效输入的自我记录,但是:
void foo(int e);
不是。此外,如果您尝试为该enum
类型传递不兼容的值,编译器可能会发出警告。来自 ISO C99 规范的附录 I(“常见警告”):
一个实现可能会在许多情况下产生警告......以下是一些更常见的情况。
[...]
- 为枚举类型的对象赋予值,而不是通过分配作为该类型成员的枚举常量,或具有相同类型的枚举变量,或返回相同枚举类型的函数的值( 6.7.2.2)。
switch
如果您在enum
类型上使用但忽略处理其所有常量并且没有default
大小写,某些编译器(例如 gcc)甚至可能会生成警告。
虽然你可以完美地说
int var = A
变体
enum mytype var = A
出于文档原因更好。
上面的答案是好的和正确的,我只想补充一点,某些调试器能够在悬停或监视枚举类型变量时显示枚举名称。这确实有助于清晰,尤其是当枚举用于状态机实现中的状态时。