巨集定義與內聯函式

2022-04-07 19:03:40 字數 1404 閱讀 9747

1、巨集定義的規則和使用解析

(1)巨集定義的解析規則就是:在預處理階段由預處理器進行替換,這個替換是原封不動的替換。

(2)巨集定義替換會遞迴進行,直到替換出來的值本身不再是乙個巨集為止。

(3)乙個正確的巨集定義式子本身分為3部分:第一部分是#dedine ,第二部分是巨集名 ,剩下的所有為第三部分。

(4)巨集可以帶引數,稱為帶參巨集。帶參巨集的使用和帶參函式非常像,但是使用上有一些差異。在定義帶參巨集時,每乙個引數在巨集體中引用時都必須加括號,最後整體再加括號,括號缺一不可。

巨集定義示例1:max巨集,求2個數中較大的乙個

#define max(a, b) (((a)>(b)) ? (a) : (b))

關鍵:第一點:要想到使用三目運算子來完成。

第二點:注意括號的使用

巨集定義示例2:sec_per_year,用巨集定義表示一年中有多少秒

#define sec_per_year (365*24*60*60ul)

關鍵:第一點:當乙個數字直接出現在程式中時,它的是型別預設是int

第二點:一年有多少秒,這個數字剛好超過了int型別儲存的範圍

帶參巨集和帶參函式的區別(巨集定義的缺陷)

(1)巨集定義是在預處理期間處理的,而函式是在編譯期間處理的。這個區別帶來的實質差異是:巨集定義最終是在呼叫巨集的地方把巨集體原地展開,而函式是在呼叫函式處跳轉到函式中去執行,執行完後再跳轉回來。

注:巨集定義和函式的最大差別就是:巨集定義是原地展開,因此沒有呼叫開銷;而函式是跳轉執行再返回,因此函式有比較大的呼叫開銷。所以巨集定義和函式相比,優勢就是沒有呼叫開銷,沒有傳參開銷,所以當函式體很短(尤其是只有一句話時)可以用巨集定義來替代,這樣效率高。

(2)帶參巨集和帶參函式的乙個重要差別就是:巨集定義不會檢查引數的型別,返回值也不會附帶型別;而函式有明確的引數型別和返回值型別。當我們呼叫函式時編譯器會幫我們做引數的靜態型別檢查,如果編譯器發現我們實際傳參和引數宣告不同時會報警告或錯誤。

注:用函式的時候程式設計師不太用操心型別不匹配因為編譯器會檢查,如果不匹配編譯器會叫;用巨集的時候程式設計師必須很注意實際傳參和巨集所希望的引數型別一致,否則可能編譯不報錯但是執行有誤。

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

2、內聯函式和inline關鍵字

(1)內聯函式通過在函式定義前加inline關鍵字實現。

(2)內聯函式本質上是函式,所以有函式的優點(內聯函式是編譯器負責處理的,編譯器可以幫我們做引數的靜態型別檢查);但是他同時也有帶參巨集的優點(不用呼叫開銷,而是原地展開)。所以幾乎可以這樣認為:內聯函式就是帶了引數靜態型別檢查的巨集。

(3)當我們的函式內函式體很短(譬如只有一兩句話)的時候,我們又希望利用編譯器的引數型別檢查來排錯,我還希望沒有呼叫開銷時,最適合使用內聯函式。

內聯函式與巨集定義

用內聯取代巨集 1.內聯可除錯 2.可進行型別安全檢查或自動型別轉換 3.可訪問成員變數。另外,定義在類宣告中的成員函式自動轉化為內聯函式。內聯函式與巨集定義 在c中,常用預處理語句 define來代替乙個函式定義。例如 define max a,b a b a b 該語句使得程式中每個出現max ...

內聯函式與巨集定義

1 內聯函式取消了引數的壓棧,減少呼叫的開銷 2 內聯函式宣告必須和定義一起,如果只有宣告,編譯器只會將它看做普通函式的宣告,如果宣告的時候使用inline,定義在其他地方也用inline,那麼它是內聯還是普通函式 普通函式。查彙編 內聯函式與普通函式一樣?3 c 類中定義的函式都預設是內聯函式,無...

內聯函式與巨集定義

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