关于在enum中使用#define的意义
来源:互联网 发布:美工助理工资一般多少 编辑:程序博客网 时间:2024/06/07 20:36
以下一段代码来自于linux中的pthread.h
enum
{
PTHREAD_CANCEL_ENABLE,
#define PTHREAD_CANCEL_ENABLE PTHREAD_CANCEL_ENABLE
PTHREAD_CANCEL_DISABLE
#define PTHREAD_CANCEL_DISABLE PTHREAD_CANCEL_DISABLE
};
一直想不明白此处将#define放入enum有何意义?在进行一遍预处理后,也没看出此处的#define有何用处。哪位有心得,讲讲!
8楼 发表于 2006-07-20 21:11 | 只看该作者
以前的版本中 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代替)而带来的影响降到了最低,是一种几乎完全的替代方案。
阅读全文
0 0
- 关于在enum中使用#define的意义
- 关于SO_REUSEADDR在setsockopt中使用的方法意义
- 关于enum的使用
- 在struct中使用define的妙法
- 关于Enum枚举类没有values()方法却可以在枚举类中使用的问题
- enum枚举的意义
- C++中应该使用const,enum,inline而非#define
- 在JSF中使用enum
- 在JavaWeb中使用enum
- #define 中 #/##的使用
- 使用enum、const、inline替换#define的原因
- 正确使用iOS常量(const)、enum以及宏(#define)在iOS开发中请尽量多使用const、enum来代替宏定义(#define);随着项目工程的逐渐增大,过多的宏定义还可能影响项目的编译
- enum,#define,const的区别
- #define与enum的区别
- Java中enum的使用
- java中enum的使用
- Java中Enum的使用
- C++中enum的使用
- 24位色BMP文件的简单分析及示例程序
- android如何在activity启动的时候隐藏输入法软键盘?
- 用rm递归递归删除子目录下所有.o后缀文件
- [转]android.mk中引用第3方 jar包的方法
- Vim实现批量注释的方法
- 关于在enum中使用#define的意义
- h5在ios下overflow:auto,滑动没有惯性解决方案
- 使用sh脚本如何替换指定目录下所有文件中的指定字符串
- Android.mk中输出log
- Android应用中横竖屏切换小结
- 多ppp实现
- Ch2,KNN分类算法程序分析----机器学习实践P19页
- 《设计模式》学习笔记2——简单工厂模式
- Linux