Effective C++ (用 const enum inline 替换#define)

来源:互联网 发布:js中获取项目本地路径 编辑:程序博客网 时间:2024/06/15 20:36

最近花了1个月的时间。把effective c++这本书的中文版刷了下,看完感觉收获很多,仔细一想却记住的不多,故慢慢的重新来一遍总结下,如果有错误,请指教。尽然一天能过一篇。有些简单的就不用记录了。


                尽量以const,enum,inline替换#define

1. 用宏,编译器在预处理源码之前,可能没有处理这个宏,或者没看见这个宏,在导致报错的时候,报出的不是这个宏的名字,而是这个宏代表的东西,导致调试这个错误要花掉大量的时间。例如
define ASPECT_RATIO 1.653 如果程序在报错的时候,报出的是1.653.是不是感觉一脸蒙蔽。
2. 宏是没有封装性的, 所以在class中 定义一个成员常量,你不能使用宏来定义,可以使用const来定义这个成员常量。
3. 大部分情况下, static const int 是允许在class 内部进行定义和初始化的,但是对于有些版本比较低的编译器,这个不允许,这个时候我们就能用enum来替代这个效果。 enum 和 宏有相似之处,他们都不能区地址,对他们进行取地址操作是错误的,而宏没有封装性,enum 就有,这个时候在Class 中就推荐使用enum 来替代这个。
4. 宏容易引起误解。 例如
define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
对于这个宏函数 。

int a = 5 , b = 0CALL_WITH_MAX(++a,b); // a被累加了2次CALL_WITH_MAX(++a,b+10) // a被累加1次。多少可怕的函数啊!!!!!!!!!!!!!!

庆幸的是,我们有template可以替代这样的函数。
所以我们有很多方式能代替宏,但是对于 Include 和 ifdef/ifndef控制着编译器,宏还不能完全消失,但是我们能尽量的少使用它,来保证我们源码的稳定。

请记住:
对于单纯的常量,最好以const对象或enums替换#defines
对于形似函数的宏,最好改用inline 函数替换#defines

阅读全文
0 0
原创粉丝点击