C語言 有參宏的定義與使用
有參宏的形式與函數有些相似,需要參數替換實現宏的展開。
1.有參宏定義的一般格式
#defme 宏名(形參表) 語言符號字符串
2.有參宏的調用
對于有參宏的調用需要傳遞參數,調用格式為:
調用格式:宏名(實參表)
對于有參宏的調用需要傳遞參數,調用格式為:
調用格式:宏名(實參表)
3.有參宏的展開
用宏調用提供的實參字符串直接置換宏定義命令行中相應形參字符串,非形參字符保持不變。
4.說明
①定義有參宏時,宏名與左圓括號之間不能留有空格。否則,C編譯系統會將空格以后的所有字符均作為替代字符串,而將該宏視為無參宏。例如:
#define SUM(a,b) a+b
如果定義成如下形式,編譯時會報錯:
#define SUM (a,b) a+b
(2)有參宏的展開,只是將實參作為字符串簡單地置換形參字符串,而不做任何語法檢查。在定義有參宏時,在整個字符串外均加一對圓括號。
5.有參宏與有參函數的比較
雖然有參宏與有參函數確實有相似之處,但不同之處更多,主要有以下幾個方面:
(1)調用有參函數時,是先求出實參的值,然后再復制一份給形參。而展開有參宏時,只是將實參簡單地置換形參。
(2)函數調用是在程序執(zhí)行期間調用時才處理的,為形參分配內存空間。而宏則是由預處理器在編譯預處理階段進行的,且宏不需要分配內存空間,不需要進行值的傳遞,也沒有“返回值” o
(3)在有參函數中,形參是有類型的,所以要求實參的類型與其一致。而在有參宏中,形參是沒有類型信息的,因此用于置換的實參,什么類型都可以。有時,可利用有參宏的這一特性,實現通用函數功能。
點擊加載更多評論>>