从特定枚举类型创建的枚举类型和变量的用途是什么

时间:2018-05-11 13:50:23

标签: c enums

我正在读关于堆栈溢出的枚举,但无法找到满意的答案

我只是想知道为什么我们创建类似

的枚举类型
enum result {pass,fail};    //result - user defined type

我本来可以写的

enum{pass,fail};

只有使用我能看到的枚举类型才能生成该特定类型的变量 喜欢

enum result test;

所以只有这个目的是使用枚举类型? (创建枚举类型的变量) 或者是否有更好的实际用途来制作类型为enum的变量

对不起,这似乎是一个重复的问题 但我做了一些研究并不满足于我读到的答案

因为我是C的初学者

2 个答案:

答案 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值提供有意义的名称。在您的示例中,您有passfail作为enum result类型的值。这允许你做类似

的事情
enum result r = pass;

或者,如果您使用数字01代替,则必须执行

int r = 1;

请注意,当您阅读enum版本时,其含义立即显而易见。当您阅读int版本时,您可能会问“为什么值为1?”和“1代表什么?”。

简而言之,enum使人们更容易阅读代码。