Chinaunix首页 | 论坛 | 博客
  • 博客访问: 829985
  • 博文数量: 213
  • 博客积分: 5048
  • 博客等级: 大校
  • 技术积分: 1883
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 10:14
文章分类

全部博文(213)

文章存档

2011年(4)

2010年(55)

2009年(47)

2008年(107)

我的朋友

分类: C/C++

2009-10-21 18:06:22

enum总的来说和宏差不多,作用差不多。
宏和枚举之间的差别主要在作用的时期和存储的形式不同,宏是在预处理的阶段进行替换工作的,它替换代码段的文本,程序运行的过程中宏已不存在了。而枚举是 在程序运行之后才起作用的,枚举常量存储在数据段的静态存储区里。宏占用代码段的空间,而枚举除了占用空间,还消耗CPU资源。 

枚举类型在使用中有以下规定:
1.
枚举值是常量,不是变量

只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。
强行转换也可以。

enum可以理解一个const int数组空间。

一下是一个人在cu上问的问题,一个人回答的很好

以前的版本中 PTHREAD_CANCEL_ENABLE 和 PTHREAD_CANCEL_DISABLE 都是定义为以下宏的形式:

CODE:
#define PTHREAD_CANCEL_ENABLE           0x00
#define PTHREAD_CANCEL_DISABLE          0x01

由于宏属于编译预处理,不属于语言本身,所以在编译预处理阶段只是进行简单的字串替换,不进行语法检查;宏在使用上还有一些固有的缺陷需要特别注意;宏名也不会增添到目标文件的符号列表中,因而不利于程序的调试,等等。

以上种种,在现代的 C 或者 C++ 语言中应该尽量避免使用宏、而是用 const、enum 或 inline (指对函数而言)等来代替,这已经是人们的共识。

楼主给出的代码反映的就是由原来的宏定义修改为枚举(enum)定义后的情况。由于 PTHREAD_CANCEL_ENABLE 和 PTHREAD_CANCEL_DISABLE 原来是宏定义,因此用户也可能把它们当作条件编译中的条件来使用,如:

CODE:
#ifdef PTHREAD_CANCEL_ENABLE
/* ... */
#endif

所 以,PTHREAD_CANCEL_ENABLE 和 PTHREAD_CANCEL_DISABLE 作为宏定义最好应该还存在,但是它们却不能再分别代表 0 和 1 了(否则编译预处理后就被替换为 0 或 1 ,这样作为枚举常量的它们实际上就没有用武之地了),因此就在enum的定义中夹杂出现了如下“奇怪”的宏定义:

CODE:
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代替)而带来的影响降到了最低,是一种几乎完全的替代方案。


阅读(1714) | 评论(0) | 转发(0) |
0

上一篇:C关键字volatile

下一篇:串口中的回车问题

给主人留下些什么吧!~~