C語言中的帶引數巨集

2021-08-26 06:28:16 字數 1051 閱讀 4424

c語言中的帶引數巨集

一.帶引數的巨集

1.帶引數的巨集定義不是簡單的字串替換,還要進行引數替換

定義格式為:

#define 巨集名(參數列) 字串

1>字串包含括號中所有指定的引數

eg: #define s(a,b) ((a)*(b))

area=s(3,2)

2>編譯系統處理帶引數的巨集名時,按程式行中指定的字串,括號內的內容,從左到右進行處理,若遇到形參則以實參代替,非形參字元原樣保留,就形成了替換後的內容,這期間沒有任何計算。

《在巨集定義中的引數稱為形參,在巨集呼叫中的引數稱為實參》

3> 在進行巨集定義時,在巨集名與帶引數的括號之間不應該加空格;否則將空格以後的內容作為替代字串的一部分,即系統將其看作不帶引數的巨集定義。

2.帶引數的巨集定義與函式的區別

1>函式呼叫時候,先求出實參表示式的值,然後代入形參。而使用帶引數的只是簡單的字元替換(在巨集展開時,並不求實參表示式的值,而之將實參字元代替形參)。

2>函式呼叫是在程式執行時處理的,為形參分配臨時的記憶體單元。而巨集展開是在編譯前執行的,在展開時並不分配記憶體單元,不進行直接的傳遞處理,也沒有返回值的概念。

(函式中以「值傳遞」,而在帶參巨集中,只是符號代替,不存在值傳遞的問題)。

3>函式中的實參和形參都要定義型別,二者的型別要求一致,如不一致則會進行型別轉換。而帶引數的巨集中引數是沒有型別的。

巨集不存在型別問題,巨集名無型別,它的引數也無型別,只是乙個符號代表,展開時代入指定的字串即可。巨集定義時,字串可以是任意型別的資料。

《帶參巨集中的形式引數不必要做型別定義,而巨集呼叫中的實參是有具體的值。因此必須對實參做型別說明》

4>使用巨集次數多時,巨集展開後源程式變長,因每展開一次都會使程式增長,而函式呼叫不會使源程式變長。

5>巨集替換不占用執行時間,只占用編譯時間。而函式呼叫則占用執行時間(分配單元,保留現場,值傳遞,返回)。

3.帶參巨集使用注意:

在巨集定義中,字串內的形參通常需要用括號括起來避免出錯,

而且應該在整個字串外加上括號。

eg: #define q(x)((x)*(x))

C語言中帶引數巨集的展開次序

最近看qemu 的機會比較多,發現裡面用了大量巨集定義,有必要學習一下。剛開始主要關注了帶引數巨集的巨集展開次序,發現了之前沒有注意到的東西。一般而言,我們在呼叫乙個帶引數巨集時,如果傳入的引數也是乙個帶引數巨集的話,我們期待的是像函式呼叫那樣,從內層到外層依次展開,依次計算出結果後,將內層巨集展開...

C語言的巨集之帶引數巨集

c語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數,這種巨集外形和作用與函式類似,即類函式巨集。但是它的行為和函式呼叫完全不同。對帶引數的巨集,在呼叫中,不僅要巨集展開,而且要用實參去代換形參。類函式巨集定義的圓括號中可以有乙個或多個引數,隨後這些引數出現在替換體...

mysql巨集引數 C語言帶引數的巨集定義

c語言允許巨集帶有引數。在巨集定義中的引數稱為 形式引數 在巨集呼叫中的引數稱為 實際引數 這點和函式有些類似。對帶引數的巨集,在展開過程中不僅要進行字串替換,還要用實參去替換形參。帶參巨集定義的一般形式為 define 巨集名 形參列表 字串 在字串中可以含有各個形參。帶參巨集呼叫的一般形式為 巨...