effective c++ item2總結:以編譯器替換預處理器

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);
}






發佈了52 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章