我正在读关于堆栈溢出的枚举,但无法找到满意的答案
我只是想知道为什么我们创建类似
的枚举类型enum result {pass,fail}; //result - user defined type
我本来可以写的
enum{pass,fail};
只有使用我能看到的枚举类型才能生成该特定类型的变量 喜欢
enum result test;
所以只有这个目的是使用枚举类型? (创建枚举类型的变量) 或者是否有更好的实际用途来制作类型为enum的变量
对不起,这似乎是一个重复的问题 但我做了一些研究并不满足于我读到的答案
因为我是C的初学者
答案 0 :(得分:3)
使用枚举常量(枚举)与使用传统的符号常量相比具有许多优点 #define的风格。这些优点包括降低维护要求,提高程序可读性, 更好的调试能力。第一个优点是枚举常量是自动生成的 由编译器。相反,符号常量必须由程序员手动赋值。
例如,如果您的程序中可能出现错误代码的枚举常量类型,那么您的 枚举定义可能如下所示:
enum Error_Code
{
OUT_OF_MEMORY,
INSUFFICIENT_DISK_SPACE,
LOGIC_ERROR,
FILE_NOT_FOUND
};
在前面的示例中,编译器会自动为OUT_OF_MEMORY
指定值0(零)
因为它首先出现在定义中。然后编译器继续自动为其分配编号
枚举常量,使INSUFFICIENT_DISK_SPACE
等于1,LOGIC_ERROR
等于2,依此类推。
如果您通过使用符号常量来接近相同的示例,您的代码将看起来像
像这样:
#define OUT_OF_MEMORY 0
#define INSUFFICIENT_DISK_SPACE 1
#define LOGIC_ERROR 2
#define FILE_NOT_FOUND 3
两种方法中的每一种都得到相同的结果:四个常量分配数值来表示错误 码。但是,如果要添加两个常量来表示错误,请考虑所需的维护 代码DRIVE_NOT_READY和CORRUPT_FILE。使用枚举常量方法,您只需将这两个常量放在枚举定义中的任何位置即可。编译器将为hese常量生成两个唯一值。使用符号常量方法,您必须手动为这些常量分配两个新数字。此外,您需要确保为这些常量指定的数字是唯一的。因为您不必担心实际值,所以使用枚举方法定义常量比使用符号常量方法更容易。枚举方法还有助于防止意外地为不同的常量重用相同的数字。
使用枚举常量方法的另一个好处是您的程序更具可读性 因此,其他可能需要稍后更新您的程序的人可以更好地理解这一点。例如,考虑一下 以下代码:
void copy_file(char* source_file_name, char* dest_file_name)
{
...
Error_Code err;
if (drive_ready() != TRUE)
err = DRIVE_NOT_READY;
...
}
查看此示例,您可以从变量err的定义派生出应该分配错误的内容 只有枚举类型Error_Code的数字。因此,如果另一个程序员要修改或添加 对于这个程序的功能,程序员会从Error_Code的定义中知道什么 常量对于分配错误有效。
相反,如果使用符号常量方法应用相同的示例,则代码将显示 像这样:
void copy_file(char* source_file, char* dest_file)
{
...
int err;
...
if (drive_ready() != TRUE)
err = DRIVE_NOT_READY;
...
}
查看前面的示例,程序员修改或添加功能到copy_file() 函数不会立即知道哪些值对于赋值给err变量有效。该 程序员需要搜索#define DRIVE_NOT_READY语句并希望所有相关的
常量在同一个头文件中定义。这可能会使维护变得更加困难,并使您的程序更难理解。
请注意 简单地将变量定义为枚举类型并不能确保只有有效值 该枚举类型将被分配给该变量。在前面的示例中,编译器 不要求只将枚举类型Error_Code中找到的值分配给err;它 由程序员决定是否只在Error_Code类型定义中找到有效值 使用。 使用枚举常量的第三个好处是某些符号调试器可以打印a的值 枚举常数。相反,大多数符号调试器无法打印符号常量的值。 这对于调试程序来说可能是一个巨大的帮助,因为如果你的程序停在那一行 使用枚举,您可以简单地检查该常量并立即知道其值。另一方面,因为 大多数调试器无法打印#define值,您很可能必须手动搜索该值 在头文件中查找。
答案 1 :(得分:1)
enum
类型允许您为int
值提供有意义的名称。在您的示例中,您有pass
和fail
作为enum result
类型的值。这允许你做类似
enum result r = pass;
或者,如果您使用数字0
和1
代替,则必须执行
int r = 1;
请注意,当您阅读enum
版本时,其含义立即显而易见。当您阅读int
版本时,您可能会问“为什么值为1?”和“1代表什么?”。
简而言之,enum
使人们更容易阅读代码。