几个原因:
原因一:灵活性:
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 或 an uint32_t
,则不是。所以你所做的就是使用
enum { yes, no, maybe };
typedef uint32_t lickahoctor;
在常量附近的某个地方为整数定义一个好名字,这会提醒人们这种类型的变量可以保存这个值。但是,如果需要,您仍然可以获得可预测的固定大小以及在子类中定义附加值的能力。
原因 4:支持位域
枚举类型的变量只支持从它们的选项中指定一个值。因此,如果您尝试实现位域,则不能将其键入为位域。此外,您需要使用无符号变量来避免符号扩展把您搞砸。