一.帶參數的宏
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))