就是代碼替換,在編譯階段進行簡單的代碼替換,大量用於宏定義開關,以及定義表達式和常量,如:函數
#define CONFIG_OPENEDurl
使用:get
#ifdef CONGFIG_OPENED編譯器
.....io
#else編譯
.....效率
#endif百度
#define NAME "TEST"im
使用:di
printf("the name is %s", NAME);
#define HAVE_DONE 1
使用:
if(HAVE_DONE) {
} else {
}
#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))
使用:
int m = ExpressionName(5,6);
講一下最後這種表達式定義的使用方式,其特色就是代碼替換,使用的地方簡介明瞭,由於是編譯階段替換,因此不會像普通函數調用那樣,涉及到參數的出棧入棧,效率就高;但這種使用方式也有問題,這種宏定義在形式上相似於一個函數,但在使用它時,僅僅只是作預處理器符號表中的簡單替換,所以它不能進行參數有效性的檢測,也就不能享受C++編譯器嚴格類型檢查的好處,另外它的返回值也不能被強制轉換爲可轉換的合適的類型,這樣,它的使用就存在着一系列的隱患和侷限性。爲此,在C++中,就引入了inline關鍵字,內聯函數(內嵌函數)。
內聯函數有下面幾個特色:
1. inline 定義的類的內聯函數,函數的代碼被放入符號表中,在使用時直接進行替換,(像宏同樣直接進行替換展開),沒有了調用的開銷,效率也很高。
2. 很明顯,類的內聯函數也是一個真正的函數,編譯器在調用一個內聯函數時,會首先檢查它的參數的類型,保證調用正確。而後進行一系列的相關檢查,就像對待任何一個真正的函數同樣。這樣就消除了它的隱患和侷限性。
3. inline 能夠做爲某個類的成員函數,固然就能夠在其中使用所在類的保護成員及私有成員。
在什麼時候使用inline函數:
首先,你可使用inline函數徹底取表明達式形式的宏定義。
另外要注意,內聯函數通常只會用在函數內容很是簡單的時候,這是由於,內聯函數的代碼會在任何調用它的地方展開,若是函數太複雜,代碼膨脹帶來的惡果極可能會大於效率的提升帶來的益處。內聯函數最重要的使用地方是用於類的存取函數。