enum总的来说和宏差不多,作用差不多。
宏和枚举之间的差别主要在作用的时期和存储的形式不同,宏是在预处理的阶段进行替换工作的,它替换代码段的文本,程序运行的过程中宏已不存在了。而枚举是
在程序运行之后才起作用的,枚举常量存储在数据段的静态存储区里。宏占用代码段的空间,而枚举除了占用空间,还消耗CPU资源。
枚举类型在使用中有以下规定:
1. 枚举值是常量,不是变量。只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。
强行转换也可以。
enum可以理解一个const int数组空间。
一下是一个人在cu上问的问题,一个人回答的很好
以前的版本中 PTHREAD_CANCEL_ENABLE 和 PTHREAD_CANCEL_DISABLE 都是定义为以下宏的形式:
#define PTHREAD_CANCEL_ENABLE 0x00
#define PTHREAD_CANCEL_DISABLE 0x01
由于宏属于编译预处理,不属于语言本身,所以在编译预处理阶段只是进行简单的字串替换,不进行语法检查;宏在使用上还有一些固有的缺陷需要特别注意;宏名也不会增添到目标文件的符号列表中,因而不利于程序的调试,等等。
以上种种,在现代的 C 或者 C++ 语言中应该尽量避免使用宏、而是用 const、enum 或 inline (指对函数而言)等来代替,这已经是人们的共识。
楼主给出的代码反映的就是由原来的宏定义修改为枚举(enum)定义后的情况。由于 PTHREAD_CANCEL_ENABLE 和 PTHREAD_CANCEL_DISABLE 原来是宏定义,因此用户也可能把它们当作条件编译中的条件来使用,如:
#ifdef PTHREAD_CANCEL_ENABLE
/* ... */
#endif
所
以,PTHREAD_CANCEL_ENABLE 和 PTHREAD_CANCEL_DISABLE
作为宏定义最好应该还存在,但是它们却不能再分别代表 0 和 1 了(否则编译预处理后就被替换为 0 或 1
,这样作为枚举常量的它们实际上就没有用武之地了),因此就在enum的定义中夹杂出现了如下“奇怪”的宏定义:
enum
{
PTHREAD_CANCEL_ENABLE,
#define PTHREAD_CANCEL_ENABLE PTHREAD_CANCEL_ENABLE
PTHREAD_CANCEL_DISABLE
#define PTHREAD_CANCEL_DISABLE PTHREAD_CANCEL_DISABLE
};
这
样定义的宏实现的是自己替换自己的功能,所以对于以后出现的 PTHREAD_CANCEL_ENABLE 或
PTHREAD_CANCEL_DISABLE 实际上没有任何影响,但是却使 PTHREAD_CANCEL_ENABLE 和
PTHREAD_CANCEL_DISABLE
两个宏有了定义,可以作为条件编译中的条件来使用。这样就将因程序修改(将宏用enum代替)而带来的影响降到了最低,是一种几乎完全的替代方案。
阅读(1774) | 评论(0) | 转发(0) |