內聯函式 普通函式 巨集定義

2021-08-09 12:02:08 字數 857 閱讀 8129

對於乙個頻繁使用的短小函式,c用巨集定義,c++用inline實現。

一、巨集定義和內聯函式、內聯函式和普通函式的區別

1、巨集定義只是普通的文字替換,巨集定義是沒有型別檢查的,無論對還是錯都是直接替換。所以巨集替換容易出錯,直接替換會產生符號的優先順序的問題會一些意想不到的結果。

內聯函式在編譯的時候會進行型別的檢查,內聯函式滿足函式的性質,比如有返回值、引數列表等。相對巨集替換來說不僅提高了效率還更加安全。

2. 巨集定義是在預編譯的階段把所有的巨集名用巨集體來替換,簡單的說就是字串替換。

內聯函式則是在編譯的時候進行**插入,編譯器會在每處呼叫內聯函式的地方直接把內聯函式的內容展開,這樣可以省去相對於普通函式的呼叫的開銷,提高效率。

3、巨集定義不可以除錯,但是內聯函式可以除錯。因為在dbuy模式裡面,內聯函式不起作用,方便除錯。在realase模式下才真正進行內聯展開。

4、多檔案之間不可以使用內聯函式,因為從符號表的角度來看內聯函式在編譯階段不產生符號,否則鏈結步驟會產生錯誤:出現無法解析的外部符號。

5、相對於普通函式來說,內聯函式在呼叫的地方被展開,可以被編譯器根據上下文進行優化。並且普通函式需要進行函式的呼叫開銷,比普通函式來說內聯函式效率高。

二、內聯函式有比較多的限制

1、內聯函式只是一種向編譯器發出的請求,但是編譯器不一定會處理成內聯函式。比如遞迴函式在編譯階段無法知道呼叫的層數、內聯函式的**體積太長、編譯器把這些函式當成普通函式處理。

2、關鍵字 inline 必須與函式定義體放在一起才能使函式成為內聯,僅將 inline 放在函式宣告前面不起任何作用。內聯函式必須在展開的地方之前看到定義,不能是宣告。所以一般把內聯函式定義放在標頭檔案中。

巨集定義函式 普通函式 內聯函式區別

巨集定義函式 例子 單行 define max a,b a b a b 多行 define malloc n,type type malloc n sizeof type 對於第乙個函式,如果用普通函式,該怎樣寫?int max int a,int b 很顯然,我們不會選擇用函式來完成這個任務,原因...

巨集定義 內聯函式 普通函式的區別

巨集定義和內聯函式的區別 第一 巨集定義時在預處理階段進行 替換,而內聯函式在編譯階段進行 替換。第二 巨集定義沒有型別檢查,而內聯函式有型別檢查。內聯函式和普通函式最大的區別是在內部實現方面上 普通函式在被呼叫時,系統首先要跳躍到該函式的入口位址,執行函式體,執行完成後,再返回到函式呼叫的地方,函...

巨集定義 內聯函式 普通函式的區別

一 巨集定義和內聯函式的區別 1.巨集定義不是函式,但是使用起來像函式。預處理器用複製巨集 的方式代替函式的呼叫,省去了函式壓棧退棧過程,提高了效率。內聯函式本質上是乙個函式,內聯函式一般用於函式體的 比較簡單的函式,不能包含複雜的控制語句,while switch,並且內聯函式本身不能直接呼叫自身...