文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>关于在enum中使用#define的意义

关于在enum中使用#define的意义

时间:2010-06-29  来源:zqqa

1楼 发表于 2006-07-20 11:44 | 只看该作者
以下一段代码来自于linux中的pthread.h
  1. enum
  2. {
  3.   PTHREAD_CANCEL_ENABLE,
  4. #define PTHREAD_CANCEL_ENABLE   PTHREAD_CANCEL_ENABLE
  5.   PTHREAD_CANCEL_DISABLE
  6. #define PTHREAD_CANCEL_DISABLE  PTHREAD_CANCEL_DISABLE
  7. };

一直想不明白此处将#define放入enum有何意义?在进行一遍预处理后,也没看出此处的#define有何用处。哪位有心得,讲讲!
  8楼 发表于 2006-07-20 21:11 | 只看该作者
以前的版本中 PTHREAD_CANCEL_ENABLE 和 PTHREAD_CANCEL_DISABLE 都是定义为以下宏的形式:
  1. #define PTHREAD_CANCEL_ENABLE           0x00
  2. #define PTHREAD_CANCEL_DISABLE          0x01

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

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

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

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

这样定义的宏实现的是自己替换自己的功能,所以对于以后出现的 PTHREAD_CANCEL_ENABLE 或 PTHREAD_CANCEL_DISABLE 实际上没有任何影响,但是却使 PTHREAD_CANCEL_ENABLE 和 PTHREAD_CANCEL_DISABLE 两个宏有了定义,可以作为条件编译中的条件来使用。这样就将因程序修改(将宏用enum代替)而带来的影响降到了最低,是一种几乎完全的替代方案。
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载