item 2:
以編譯器替換預處理器(以const,enum,inline替換#define):
#define不被視爲語言的一部分,那正是他的問題所在。
sam1:
#define ASPECT_RATIO 1.534
替換爲:
const double AspectRatio=1.534;
名稱記號ASPECT_RATIO也許從未被編譯器看見:可能在編譯器開始處理源碼之前就被預處理器移走了。作爲一個語言常量,AspectRatio肯定會被編譯器看到,通常還導致較少的代碼量,因爲預處理器“盲目將宏名稱ASPECT_RATIO 替換爲1.534”可能導致目標代碼出現多份1.534,而const不會。
Sam2:
無法利用#define創建一個class專屬常量,因爲#define並不重視作用域。這意味#define不僅不能夠定義class專屬常量,也不能提供任何封裝性。
a)
class GamePlayer{
static const int NumTurns=5; //常量聲明式
int scores[NumTurns];
....
}; //通常在頭文件
const int GamePlayer::NumTurns; //NumTurns定義式,放在源文件
b)
class GamePlayer{
enum {NumTurns=5};
int scores[NumTurns];
....
}; //通常在頭文件
enum hack的行爲某方面比較像#define,比如取enum和#define的地址不合法,而取const地址合法。如果不想讓別人獲得一個pointer或reference指向你的某個整數常量,enum可以實現這個約束。
sam3:
對於形似函數的宏,最好改用inline函數替換#define。
#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);
}