MyFPGA Forum

 找回密码
 注册
搜索
查看: 5885|回复: 1
打印 上一主题 下一主题

enum 关键字

[复制链接]
跳转到指定楼层
1#
发表于 2010-5-21 13:39:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.用enum关键字说明常量有什么好处?
用enum关键字说明常量(即说明枚举常量)有三点好处:
    (1)用enum关键字说明的常量由编译程序自动生成,程序员不需要用手工对常量一一赋值。
    (2)用enum关键字说明常量使程序更清晰易读,因为在定义enum常量的同时也定义了一个枚举类型标识符。
    (3)在调试程序时通常可以检查枚举常量,这一点是非常有用的,尤其在不得不手工检查头文件中的常量值时。
    不过,用enum关键字说明常量比用#define指令说明常量要占用更多的内存,因为前者需要分配内存来存储常量。
    以下是一个在检测程序错误时使用的枚举常量的例子:
    enum Error_Code
    {
        OUT_OF_MEMORY,
        INSUFFICIENT_DISK_SPACE,   
        LOGIC_ERROR,   
        FILE_NOT_FOUND   
    }  ;
2.与用#define指令说明常量相比,用enum关键字说明常量有什么好处?
与用#define指令说明常量(即说明标识符常量)相比,用enum关键字说明常量(即说明枚举常量)有以下几点好处:
    (1) 使程序更容易维护,因为枚举常量是由编译程序自动生成的,而标识符常量必须由程序员手工赋值。例如,你可以定义一组枚举常量,作为程序中可能发生的错误的错误号,请看下例:
    enum Error_Code   
    {
       OUT_OF_MEMORY,   
       INSUFFICIENT_DISK_SPACE,   
       LOGIC_ERROR,
       FILE+NOT_FOUND
    }  ;   
    在上例中,OUT_OF_MEMORY等枚举常量依次被编译程序自动赋值为0,1,2和3。
    同样,你也可以用#define指令说明类似的一组常量,请看下例:
    #define OUT_OF_MEMORY             0   
    #define INSUFFICIENT_DISK_SPACE    1
    #define LOGIC_ERROR                2
    #define FILE_NOT_FOUND             3
    上述两例的结果是相同的。
    假设你要增加两个新的常量,例如DRIVE_NOT_READY和CORRUPT_FILE。如果常量原来是用enum关键字说明的,你可以在原来的常量中的任意一个位置插入这两个常量,因为编译程序会自动赋给每一个枚举常量一个唯一的值;如果常量原来是用#define指令说明的,你就不得不手工为新的常量赋值。在上面的例子中,你并不关心常量的实际值,而只关心常量的值是否唯一,因此,用enum关键字说明常量使程序更容易维护,并且能防止给不同的常量赋予相同的值。
    (2)使程序更易读,这样别人修改你的程序时就比较方便。请看下例:
    void copy_file(char*  source_file_name,  char *  dest_file_name)
    {   
        ......
        Error_Code,err;
        ......
        if(drive_ready()!=TRUE)
        err=DRIVE_NOT_READY;
        ......
    }   
    在上例中,从变量err的定义就可以看出;赋予err的值只能是枚举类型Error_Code中的数值。因此,当另一个程序员想修改或增加上例的功能时,他只要检查一下Error_Code的定义,就能知道赋给err的有效值都有哪些。
注意:将变量定义为枚举类型后,并不能保证赋予该变量的值就是枚举类型中的有效值。
    在上例中,编译程序并不要求赋予err的值只能是Error—Code类型中的有效值,因此,程序员自己必须保证程序能实现这一点。
    相反,如果常量原来是用#define指令说明的,那么上例就可能如下所示:
    void copy_file(char *source *file,char *dest_file)
    {  
        ......  
        int err;
        ......
        if(drive_ready()!=TRUE)
            err=DRIVE_NOT_READY;
        ......
    }
    当另一个程序员想修改或增加上例的功能时,他就无法立即知道变量err的有效值都有哪些,他必须先检查头文件中的#defineDRIVE_NOT_READY语句,并且寄希望于所有相关的常量都在同一个头文件中定义。
    (3)使程序调试起来更方便,因为某些标识符调试程序能打印枚举常量的值。这一点在调试程序时是非常用的,因为如果你的程序在使用枚举常量的一行语句中停住了,你就能马上检查出这个常量的值;反之,绝大多数调试程序无法打印标识符常量的值,因此你不得不在头文件中手工检查该常量的值。
2#
发表于 2010-7-21 11:20:06 | 只看该作者
学习...建议lz弄个C的专题...嘻嘻..
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-5-3 11:05 , Processed in 0.052881 second(s), 14 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表