[原創文章歡迎轉載,但請保留作者信息]
Justin 于 2009-10-23
這回講的是#define的問題。
很多面經上面都不會缺少關于代碼中常數一定要define一下增加可讀性等等。認真D學習鳥Item2我才知道:看來我也算是中毒不淺……
大師第二堂課的中心思想是:
-
同學們以后需要定義常量時,不要用#define啦,改用const修飾的變量或是用enum吧
-
要想寫一些簡短小函數時,別考慮#define啦,改用template+inline吧
光知其然當然不行,下面是其所以然:
-
原因是用const減小了代碼大小,同時還使得封裝(encapsulation)變得可行,而且,在調試的時候,因為const定義的變量是會加在符號表(Symbol Table)的,就比#define的常量要方便跟蹤了(在預處理階段,常量的名字就已經被替換掉了)
在一些特定的情況下(自己去查書啦,懶得抄書了)如果不能用const取代#define,就用enum。除了不能獲取一個enum的地址之外,這種方法和const的用法其實差不多。
-
inline函數和宏有個共同的地方,他們都不會有函數調用的棧的開銷。再喊上模板(template)來幫忙,就不用去考慮實際調用時的參數類型。
有了這兩兄弟,就可以淘汰掉#define了,因為這個家伙出現的地方經常會很隱蔽地“強奸”傳進的參數,出來以后可能就已經不成人樣了。比如說:傳進a++作為參數……(OK,又到了自己去看書找例子的時候了:))
于是乎,在const、enum和模板inline的聯合進攻下,#define潰不成軍痛哭流涕尿著褲子淚奔而去~