一、问题
枚举类型是 ANSIC 新标准中增加的,在C编译中,对枚举元素按常量处理,因此称枚举常量,它们不是变量,⽽ #define 是预处理中的宏定义,定义⼀个符号常量。那么,枚举与#define 宏存在哪些区别呢?
二、解答
1.枚举与#define 宏的概述
(1)所谓枚举,是指将变量的值⼀⼀列举出来,变量的值只限于列举出来的值的范围内。
例如,声明⼀个枚举类型 weekday:
enum weekday (sun,mon,tue,wed,thu,fri,sat);
C语⾔编译按定义时的顺序使它们的值为 0,1,2…。可以输出枚举元素的值,也可以给枚举元素⾃定义值,后⾯的元素按顺序依次加1。如定义 sun=7,mon=1,那么依次加 为 tue=2, wed=3,…,sat=6。
(2)#define 宏定义是⽤⼀个指定的标识符来代表⼀个字符串。
例如:
#define Pl 3.14
此宏定义的作⽤是指定标识符 PI 来代替 “ 3.14 ” 这个字符串,在编译预处理时,将程序中在该命令以后出现的所有的 Pl 都⽤ “ 3.14 ” 代替。它可以使⽤户能以⼀个简单的名字代替⼀个⻓的字符串。在程序中需要更改这个参数时,只需在宏定义中更改这个字符串就可以,从⽽降低出错率。
2. 枚举与#define 宏的区别
(1)在编译器中可以调试枚举变量,但是不能调试宏常量。
(2)#define 宏常量是在预编译阶段进⾏简单替换。枚举常量则是在编译的时候确定其值。
(3) 枚举可以⼀次定义⼤量相关的常量,⽽#define 宏⼀次只能定义⼀个。
三、总结
其实学习⼀门编程语⾔很容易,但是在学习的过程中要学会随时整理⼰学的知识,将意思相近易混的知识做对⽐。只有对⽐之后,才会让原本零散的知识在脑中分类,知识体系才会更清晰,不会导致在学了很多的知识后,觉得⾃⼰知识学杂了,学乱了,越学越糊涂了。
说明:
ANSIC 标准规定可以在 C 源程序中加⼊⼀些 “ 预处理命令 ” (preprocessor directives ), 以改进程序设计环境,这些预处理命令不是C语⾔本⾝的组成部分,不能直接对它们进⾏ 编译,必须在对程序进⾏通常的编译之前,先对程序中这些特殊的命令进⾏“预处理”, 即根据预处理命令对程序做相应的处理。
例如,#define 宏定义了⼀个符号常量 A,则在预 处理时将程序中所有的 A 都置换为指定的字符串。