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

最近花了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 = 0
CALL_WITH_MAX(++a,b); // a被累加了2次
CALL_WITH_MAX(++a,b+10) // a被累加1次。
多少可怕的函数啊!!!!!!!!!!!!!!

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章