条款02:尽量以const,enum,inline替换#define
2016-07-10 22:27
309 查看
在说明主题前,先描述#define的缺点:
1、#define定义的符号在预处理阶段,会被编译器替换成符号所代表的实际值。不利于程序的追踪。
2、#define没有作用域的概念。
3、#define表达能力有限。如:#define S(x) (x)*(x)。
欲解决问题,我们必须先了解什么情况会出现,为此,我们带着#define的使用展开,其使用可分为两种情况:
其一,如果#define仅仅是简单的符号定义,针对问题1,我们只需引入const修饰符或enum,不过根据#define使用的场合不同,具体的实现也不一样:
(a)当表达为全局常量或namespace常量时,直接用const修饰即可。
(b)当表达为类常量时,整型可定义为static const int…或enum {…}(enum hack),其他可定义为static const …,再在相应类实现里定义此常量。
解决了问题1,问题2也就迎刃而解。
另一种情况,如果#define是函数式定义,这种情况一般是为了节约函数调用开销,针对问题3,我们可以利用inline函数完美解决问题。
因此,尽量以const,enum,inline替换#define。
1、#define定义的符号在预处理阶段,会被编译器替换成符号所代表的实际值。不利于程序的追踪。
2、#define没有作用域的概念。
3、#define表达能力有限。如:#define S(x) (x)*(x)。
欲解决问题,我们必须先了解什么情况会出现,为此,我们带着#define的使用展开,其使用可分为两种情况:
其一,如果#define仅仅是简单的符号定义,针对问题1,我们只需引入const修饰符或enum,不过根据#define使用的场合不同,具体的实现也不一样:
(a)当表达为全局常量或namespace常量时,直接用const修饰即可。
(b)当表达为类常量时,整型可定义为static const int…或enum {…}(enum hack),其他可定义为static const …,再在相应类实现里定义此常量。
解决了问题1,问题2也就迎刃而解。
另一种情况,如果#define是函数式定义,这种情况一般是为了节约函数调用开销,针对问题3,我们可以利用inline函数完美解决问题。
因此,尽量以const,enum,inline替换#define。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解