什么是以下两个术语的区别:
enum week{Mon, Tue, Wed, Thur, Fri, Sat, Sun};
enum week day = Wed;
与
enum week{Mon, Tue, Wed, Thur, Fri, Sat, Sun};
int day = Wed;
在C语言中,为什么要使用枚举类型的变量而不是普通的int类型变量呢?
使用枚举的好处在于可以更清晰地表达你的意图,无论是对于阅读你代码的人还是编译器。例如,任何半靠谱的编译器都会警告你如果使用枚举时有不完整的 switch
案例:
switch (day) {
case Mon: printf("Monday\n"); break;
case Tue: printf("Tuesday\n"); break;
}
使用GCC(带有-Wall
)会发出以下信息:
如果warning: enumeration value 'Wed' not handled in switch [-Wswitch]
7 | switch (day) { | ^~~~~~
…
day
的类型是int
,您将不会收到这个非常有用的警告。enum
的标识符/常量具有int
类型,因此可以将它们的值分配给int
变量:
但是,枚举的类型可能因实现而异:"枚举列表中的标识符被声明为具有
int
类型的常量,并且可以出现在任何允许使用这种类型的地方。"C18,§6.7.7.2/3
因此,坚持使用"每个枚举类型都应与
char
、带符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,131) 但应能够表示枚举所有成员的值。"C18,§6.7.7.2/4
enum
类型可能会防止处理enum
时出现任何类型问题,除了更易读之外。
int
类型,则很容易将另一个enum
类型的常量分配给day
。enum week {Mon, Tue, Wed, Thur, Fri, Sat, Sun};
enum month {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dez};
int day = Mar;
这段代码可以顺利编译。
当使用类型enum week
代替day
时,高级编译器可能会发出警告,并增加额外的安全层级。
enum week {Mon, Tue, Wed, Thur, Fri, Sat, Sun};
enum month {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
enum week day = Mar;
-Wall
或-Wenum-conversion
标志才能发出相同的警告。
sizeof(enum week)
的大小可能小于sizeof(int)
。C 规范指出,枚举类型将与char
、有符号整数类型或无符号整数类型兼容。我想编译器可以使类型比int
更宽,但由于所有枚举常量都是类型int
,因此没有必要使其比int
更宽。 - Ian Abbott