1. 程式人生 > >帶參巨集和行內函數

帶參巨集和行內函數

**巨集可以帶引數(引數是形參),稱為帶參巨集。**巨集和函式各有千秋,各有優劣。總的來說,如果程式碼比較多用函式適合而且不影響效率;但是對於那些只有一兩句話的函式開銷就太大了,適合用帶參巨集。但是用帶參巨集又有缺點:不檢查引數型別。

示例:MAX巨集,三目運算子求2個數中較大的一個 #define MAX(a, b) (((a)>(b)) ? (a) : (b)) 。
示例:用巨集定義表示一年中有多少秒 #define SEC_PER_YEAR (3652460*60UL) 注意:當一個數字直接出現在程式中時,預設是int型別,一年有多少秒,這個數字剛好超過了int型別儲存的範圍,要轉成無符號數(用%u列印)

行內函數和inline關鍵字 (行內函數一般僅僅是為了減少呼叫開銷,並沒有特別的實際意義)
(1)行內函數通過在函式定義前加inline關鍵字實現。
(2)行內函數本質上是函式,所以有函式的優點(行內函數是編譯器負責處理的,編譯器可以幫我們做引數的靜態型別檢查);但是他同時也有帶參巨集的優點(不用呼叫開銷,而是原地展開)。所以幾乎可以這樣認為:行內函數就是帶了引數靜態型別檢查的帶參巨集。
(3)當我們的函式內函式體很短(譬如只有一兩句話)的時候,我們又希望利用編譯器的引數型別檢查來排錯,我還希望沒有呼叫開銷時,最適合使用行內函數。

注意:
巨集和inline函式的連結屬性為無連線,因為在編譯的時候會被展開到原來的函式裡面去。