在C语言中为何需要实例化enum类型?用int替代可行吗?
先看这个场景:我们在main函数外声明枚举类型:
enum months {Jan, Feb, Mar};
既可以用int变量存储枚举成员:
int main () { int m = Feb; printf("%d", m); }
运行后输出1;也可以创建枚举类型的实例来存储:
int main () { enum months m = Feb; printf("%d", m); }
结果同样是输出1。既然int就能存枚举值,为啥还要专门用枚举类型的变量?
原因主要有这几点:
类型提示与可读性:用
enum months声明变量,任何人看代码都能立刻明白这个变量是用来存月份的,范围就限定在Jan、Feb、Mar这些值里。而int变量没有这个语义,你得额外加注释说明它是月份,不然别人可能以为它是天数、序号或者其他数字。编译器的错误检查:有些编译器会对枚举类型变量的赋值做检查,如果你不小心给
enum months变量塞了一个不属于该枚举的整数(比如m = 10),编译器可能会抛出警告,提醒你这个赋值不符合变量的预期用途。但int变量不会有这种提示,错了也不会报警,容易埋下bug。避免硬编码的魔法数字:虽然枚举成员本质是整数,但用
Feb比直接写1可读性强太多。如果后期需要调整枚举的定义(比如把Jan改成从1开始:enum months {Jan=1, Feb, Mar};),用枚举类型的变量完全不用改赋值代码,直接用成员名就行;但如果是int变量用了硬编码的1,就得挨个找出来修改,很容易漏改出错。代码规范与协作一致性:在团队开发的代码规范里,通常会要求用枚举类型来表示这种有限的离散值(比如月份、状态码、选项类型),这样所有人写的代码风格统一,理解成本更低。而且有些接口设计就是要求传入枚举类型参数,用int虽然能凑合用,但不符合接口的设计意图,也容易出现参数传错的问题。
内容的提问来源于stack exchange,提问作者Khaboos Guy

