讀書筆記《Effective c++》 條款02 儘量用const,enum,inline代替#define

1.儘量用const,enum,inline代替#define

以編譯器代替預處理器。

a.使用#define可能導致編譯器錯誤信息不明顯,而常量會進入符號表。

b.#define沒有作用域的限定。

c.當編譯器不支持類內靜態常量初始化,而又必須使用此常量來定義數組時(編譯器要求編譯期就能計算出數組的長度),可以使用the enum hack,enmu{MAX_LEN = 50};the enum hack的行爲更像是#define,比如可以取常量的地址,但是不能取enum的地址

結論:

a.對於單純的常量,最好以const對象或enum代替#define;

b.對於形似函數的宏,最好以inline代替#define;

寫例子時遇到的問題:

a.對於未使用的變量和參數,編譯器會提出警告,可以使用UNDEFINED_PARAM之類的宏修飾,也可以直接使用一個空函數模板,類似這種 template<typename T> void UNUSED_VAR(const T&){}; 這樣來生成一個空函數調用,編譯器也會將其優化掉。

b.一個網上看到的問題,對於引用,T const& a和const T& a其實沒有什麼區別(類似指針),當然和T & const a是有區別的,比如後者不能接受常量(因爲這裏需要一個左值),不過個人認爲這種寫法很奇怪,畢竟引用其實本身應該是包含const的含義


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