enum和#define共存
来源:互联网 发布:周扬青买化妆淘宝店名 编辑:程序博客网 时间:2024/05/20 18:16
枚举和#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_ENABLE和PTHREAD_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
- enum和#define共存
- #define、const和enum
- #define、const和enum
- #define、const和enum常量
- 区别#define、enum和const
- 宏(#define),枚举型(enum)和const常量
- enum和typedef 与#define宏定义的区别
- 1.7、enum、#define和typedef的注意点
- #define宏定义和const及enum枚举的区别
- enum union #define typedef
- #define?const?还是enum?
- define const enum
- enum define typedef
- 了解#define、const、enum
- define、enum、const
- const,enum,inline替换#define
- static const inline #define enum
- enum,#define,const的区别
- 莫队算法—【清ojA1206】【bzoj2038】小Z的袜子
- GDB调试器使用总结
- 最长上升子序列1002
- Lua脚本之语法基础快速入门
- 异常抛出throw与throws的区别
- enum和#define共存
- Fiddler抓取Android真机上的HTTPS包
- POJ 1222 EXTENDED LIGHTS OUT 开关问题
- python 接口实现 供第三方调用
- 解决ADO控件遍历数据集超慢的问题
- 香甜的黄油 Sweet Butter
- TP5"踢飞我", 带你飞 ~~ 导入\导出
- Windows Server 2008r2配置主DNS域名服务器
- Github上关于iOS的各种开源项目集合(强烈建议大家收藏,查看,总有一款你需要)