C 巨集和內聯函式

2021-06-21 00:57:57 字數 1806 閱讀 4622

c++內聯函式  

巨集:就是使用乙個字串來代替乙個表示式大媽或函式呼叫**;編譯之前,預處理器會使用這個巨集字串所代表的表示式**或函式呼叫**來替換所有出現的巨集字串,這樣的話,用巨集表示的函式呼叫**就不用另外開闢函式棧,不用保護和恢復函式呼叫現場,這樣就提高了**的執行效率;所以,呼叫乙個巨集比呼叫乙個函式更有效;

但是呼叫巨集的時候,有乙個缺點:由於巨集在預處理時使用的是巨集字串替換,所以,編譯器在編譯的時候不知道巨集所代表的**的語法,不知道巨集所代表的**的資料型別,沒有安全檢查;如果出現的類裡面,巨集不能訪問類的私有成員,而且容易產生二意性;所以,巨集也有自己不能解決的、不可避免的問題;

解決巨集定義函式所帶來的問題的辦法,就是使用內聯函式;可以使用內聯函式來代替巨集定義;

內聯函式與巨集的區別在於:巨集是由預處理器來對巨集進行替代,沒有語法檢查、型別檢查和安全檢查;內聯函式是通過編譯器的控制來實現的,有語法檢查、型別檢查和安全檢查;內聯函式是真正的函式,而且在呼叫的地方,由編譯器負責把內聯函式的函式體**塊替換到內聯函式被呼叫的地方,這一點與巨集替換很相似;內聯函式有引數,有返回值;由於內聯函式可以像巨集一樣被展開,所以呼叫內聯函式的時候,取消了函式引數壓棧、出棧所帶來的開銷,從而減少了函式呼叫開銷;這就是內聯函式的優越於巨集的地方;

內聯函式的宣告和內聯函式的函式體的定義必須在一起;下面宣告內聯函式的語句是無效的:

inline int max(int a, int b);

而下面的內聯函式的定義是有效的:

inline int max(int a, int b);

c++類的成員函式也可以被定義為內聯函式;比如:

class student

//該成員函式預設自動為內聯函式(隱式定義內聯函式)

int getid(void)       //該成員函式預設自動為內聯函式(隱式定義內聯函式)

inline void setage(int nage)   //顯式定義內聯函式

inline int getage(void)        //顯式定義內聯函式

void setscore(float fscore);         //類定義體內沒有宣告為內聯函式;

float getscore(void);                //類定義體內沒有宣告為內聯函式;

}inline void student::setscore(float fscore) //類定義體外實現為內聯函式;

inline float student::getscore(void)         //類定義體外實現為內聯函式;

c++中,在類定義體內部定義了函式體的成員函式,被編譯器預設為內聯函式,而不管這個函式頭前面是否有關鍵字inline,比如:setid()、getid()、setage()、getage();也可以把實現在類定義體外部的成員函式定義為內聯函式,這個時候在類定義體中只有成員函式頭的宣告,而其實現是在類定義體外部,比如:setscore()和getscore();

即便是可以把實現在類定義體外部的成員函式定義為內聯函式,那該成員函式的實現也必須寫在宣告類定義體的哪個標頭檔案(.h)中,不能違反規則;即:內聯函式的定義和實現都必須在同乙個頭(.h)檔案中;

內聯函式的侷限性:

1、由於內聯函式與巨集一樣也是實現為**替換,所以定義為內聯函式的函式體不宜過大,如果函式體過大,則某些普通的編譯器就會放棄內聯方式,而改用呼叫普通函式的方式,這樣就失去了內聯函式的意義了;所以,內聯函式的函式體**不宜過大,一般就是3---4行**即可;

2、由於內聯函式是編譯器在便宜階段進行函式體展開的,所以,這就把類的內聯函式的定義與實現都必須在宣告類的那個標頭檔案中,而不能放在實現類的那個cpp檔案中;這一點與模板template<>的特性相似;

C 內聯函式和巨集定義

預備知識 c c 編譯過程 step1 預處理 由預處理器 乙個簡單的程式 將程式設計師通過預處理器指令 參考部落格 c c 預處理器指令c c 預處理指令 定義好的模式代替源 中的模式。step2 第一遍編譯 對預處理過的 進行語法分析,編譯器把源 分解成小的單元並把它們按樹形結構組織起來。比如表...

內聯函式和巨集

1.內聯函式 在c 中我們通常定義以下函式來求兩個整數的最大值 複製 如下 int max int a,int b 為這麼乙個小的操作定義乙個函式的好處有 閱讀和理解函式 max 的呼叫,要比讀一條等價的條件表示式並解釋它的含義要容易得多 如果需要做任何修改,修改函式要比找出並修改每一處等價表示式容...

內聯函式和巨集

第一部分 巨集 為什麼要使用巨集呢?因為函式的呼叫必須要將程式執行的順序轉移到函式所存放在記憶體中的某個地 址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作要求在轉去執行前要儲存現場並記憶執行的位址,轉回後要恢復現場,並按原來 儲存位址繼續執行。因此,函式呼叫要有一定的時間...