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

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