條款02:儘量以const, enum, inline 替換 #define 【讀書筆記 Effective C++】

 

#define ASPECT_RATIO 1.653

 

 

基礎知識:

(1)宏定義#define NAME Value 是預處理器處理,編譯器無法看到NAME,沒有進入記號表(symbol table)中。

 

存在問題:

(1)當運用該常量獲得一個編譯錯誤信息時,由於ASPECT_RATIO不在symbol table中,那麼編譯錯誤提示1.653而不是ASPECT_RATIO。如果ASPECT_RATIO被定義在一個非你寫的頭文件內,你將爲追蹤它而花費時間。

(2)產生過多的目標代碼(object code),因爲預處理器會將所有ASPECT_RATIO都替換爲1.653

(3)宏函數雖然簡便,不會導致函數調用帶來的開銷,但容易誤用

 

解決方法:

(1)使用常量替換宏

const double AspectRatio = 1.653

 

(2)對於class 專屬常量,爲了將常量的作用域限定在class內,那麼它既要是class的一個成員,又要保證此常量至多隻有一份實體,可以使用靜態成員:

static const int Count = 5;

或:

enum {Count = 5};

 

(3)對於宏函數,使用inline函數替換

#define CALL_WITH_MAX(a., b) f((a) > (b) ? (a) : (b))

替換爲

template<typename T>

inline void callWithMax(const T&a, const T&b)

{

    f(a > b ? a : b);

}

這樣做的好處:

a. 不需要考慮爲函數參數加上過多的括號

b. 不用擔心參數被計算多次(如宏函數中a++)

c. 可以控制作用域和訪問規則(比如該函數可以是class 成員函數)

 

注意:

對於字符串常量一般寫爲

const string authorName("Scott Meyers");

而不寫成(避免多個const)

const char *const authorName = "Scott Meyers";

 

 

 

 

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