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的含義