#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";