有几个原因:
原因1:灵活性:
enum lickahoctor { yes = 0, no = 1, maybe = 2 }
声明一个枚举类型。你可以在任何地方使用yes
、no
和maybe
这些值,并将它们赋值给任何整数类型。你也可以将其作为一种类型来使用,写法如下:
enum lickahoctor myVar = yes
这样做很好,因为如果一个函数需要一个类型为 "enum lickahoctor" 的参数,你就知道可以将
yes
、
no
或
maybe
分配给它。此外,调试器也会知道,所以它会显示符号名称而不是数值。问题在于,编译器只允许你将你在
enum lickahoctor
中定义的值分配给
myVar
。例如,如果你想在基类中定义一些标志,然后在子类中添加一些标志,就不能用这种方式。
如果你使用一个 int,就不会有这个问题。所以你想使用某种 int,这样你就可以分配任意常数。
原因 2: 二进制兼容性:
编译器选择适合所有你在枚举中定义的常量的大小。你无法保证你会得到什么。因此,如果你直接将包含这样一个变量的结构体写入文件,则不能保证在下一个版本的应用程序中读取时它仍然是相同的大小(至少根据 C 标准如此 -- 在实践中并不完全是这样)。
如果你使用某种 int,平台通常会保证该数字具有特定的大小。特别是如果你使用了那些保证具有特定大小的类型之一,比如
int32_t
/
uint32_t
。
原因 3: 可读性和自我记录
当你声明上面的
myVar
时,可以立即知道可以将哪些值放入其中。如果你只是使用一个 int 或一个
uint32_t
,那就不是这样了。所以你要使用
enum { yes, no, maybe };
typedef uint32_t lickahoctor;
为整数定义一个好的名称,放在常量附近,以提醒人们此类型的变量可以存储这个值。但是您仍然可以获得可预测的、固定大小和在需要时定义子类中的其他值的优势。
原因4: 支持位字段
枚举类型的变量只支持从其选项中精确赋值一个值。因此,如果您尝试实现位字段,则不能将其类型定义为枚举类型。此外,您需要使用无符号变量来避免符号扩展带来的问题。