enum和#define共存

枚举和#define共存的情况

enum

{

  PTHREAD_CANCEL_ENABLE,

#definePTHREAD_CANCEL_ENABLE   PTHREAD_CANCEL_ENABLE  //其实就是字符串替换,所以PTHREAD_CANCEL_ENABLE还是枚举常量,但是却又实现了宏

  PTHREAD_CANCEL_DISABLE

#definePTHREAD_CANCEL_DISABLE  PTHREAD_CANCEL_DISABLE

};

以前的版本中 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,

#definePTHREAD_CANCEL_ENABLE  PTHREAD_CANCEL_ENABLE

  PTHREAD_CANCEL_DISABLE

#definePTHREAD_CANCEL_DISABLE  PTHREAD_CANCEL_DISABLE

};


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

 

 

代码测试结果:可知这样的枚举和宏定义实现了枚举和宏定义的共生同时存在!

 

#include <stdio.h>

 

typedef enum PTHREAD_ENUM{

 PTHREAD_CANCEL_ENABLE,

#define PTHREAD_CANCEL_ENABLE  PTHREAD_CANCEL_ENABLE

 PTHREAD_CANCEL_DISABLE

#define PTHREAD_CANCEL_DISABLE  PTHREAD_CANCEL_DISABLE

}PTHREAD_ENUM;

 

int main(int argc,char *argv[])

{

   PTHREAD_ENUMPTHREAD_ENUM1;

  PTHREAD_ENUM1=PTHREAD_CANCEL_DISABLE;

  printf("PTHREAD_ENUM1=%d\n",PTHREAD_ENUM1);

   #ifdefPTHREAD_CANCEL_DISABLE

         printf("PTHREAD_ENUM1 has benn define\n");

   #endif

   return 0;

}

运行结果:

PTHREAD_ENUM1=1
PTHREAD_ENUM1 has benn define

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值