盡量以const,enum,inline 替代define
這條可以改為”甯可以編譯器替換預處理器”比較好
首先#define 很友善,但是,它也存在很多問題
1.比如 #define ASPECT_RATIO 1.653
記号名稱ASPECT_RATIO從未被編譯器看見,因為它被預處理器替換掉了之後,才輪到編譯器運作 如果出現問題,你隻會在error裡隐約看到1.653,如果 ASPECT_RATIO 被定義在一個不是你寫的頭檔案中,你肯定會對1.653的錯誤出自何處毫無頭緒,這樣就浪費了尋找的時間
2用define 定義宏
比如#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b)),我們從他的複雜度來看,它挺繞,對不對
然後呢,假如我以下面的方式使用它
int a=5,b=0;
CALL_WITH_MAX(++a,b);
CALL_WITH_MAX(++a,b+10);
這段代碼就有問題了
CALL_WITH_MAX(++a,b);
相當于
f((++a)>b?(++a):(b))我們看到這裡a被累加了兩次,是以宏具有不确定性
針對第一個問題
我們可以使用const
const double ASPECT_RATIO=1.653 作為一個const常量,ASPECT肯定會被編譯器看到
或者可以使用enum {ASPECT_RATIO=?},但是記住,enum hack隻能是整數
針對第二個問題
我們可以使用inline函數
template<typename T>
inline void CallWithMax(const T& a,const T& b)
{
f(a>b?a:b);
}
這樣就解決了宏的歧義問題
雖然,預處理器的需求因為const,enum,inline而降低了,但并非完全消除,#include仍然必不可少,#ifdef/#ifndef繼續扮演着控制編譯的作用
是以
總結:
1.對于單純常量,最好以const對象或enums替代#defines
2.對于形似函數的宏,最好改用inline函數替代#define