天天看點

effective c++條款02

盡量以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

繼續閱讀