#define pi 3.1415926
#define s(r) pi*r*r
(1)函式呼叫時,先求出實參表示式的值,然後代入形參,而使用帶引數的巨集只是進行簡單的字元替換。例如s(a+b),在巨集展開時並不求a+b的值,而只將實參字元「a+b替換形參r」
(2)函式呼叫是在程式執行時處理的,為形參分配臨時的記憶體單元。而巨集展開則是在編譯前進行的,在展開時並不分配記憶體單元,不進行值的傳遞處理,也沒有「返回值」的概念。
(3)對函式中的實參和形參都要定義型別,二者的型別要求一致,如不一致,應進行型別轉換。而巨集不存在型別問題,巨集名無型別,它的引數也無型別,只是乙個符號代表,展開時代入指定的字串即可。巨集定義時,字串可以是任何型別的資料。
(4)函式呼叫只可得到乙個返回值,而巨集可以設法得到多個結果。
#define pi 3.1415926
#define circle(r,l,s,v) l=2*pi*r;s=pi*r*r;v=4.0/3.0*pi*r*r*r
(5)使用巨集次數多時,巨集展開後源程式變長,因為每展開一次都使得程式增長,而函式呼叫不會使源程式變長。
(6)巨集替換不佔執行時間,只佔編譯時間。而函式呼叫則占用執行時間(分配單元、保留現場、值傳遞、返回)
帶引數的巨集與函式的區別
1.函式呼叫時,先求出實參表示式的值,然後帶入形參。而使用帶參的巨集只是進行簡單的字元替換。2.函式呼叫是在程式執行時處理的,分配臨時的記憶體單元 而巨集展開則是在編譯時進行的,在展開時並不分配記憶體單元,不進行值的傳遞處理,也沒有 返回值 的概念。3.對函式中的實參和形參都要定義型別,二者的型別要...
不帶引數的巨集定義與帶引數的巨集定義
巨集定義是c提供的三種預處理功能的其中一種,這三種預處理包括 巨集定義 檔案包含 條件編譯 1.不帶引數的巨集定義 巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 格式 define 識別符號 字串其中的識別符號就是所謂的符號常量,也稱為 巨集名 預處理 預編譯 工作也叫做巨集展開 將巨集名替換為字串...
帶引數的巨集定義
不是進行簡單的字串替換,還要進行引數替換。其定義的一般形式為 define 巨集名 參數列 字串 字串中包含在括弧中所指定的引數。如 define s a,b a b area s 3,2 定義矩形面積s,a 和 b 是邊長。在程式中用了s 3,2 把3 2分別代替巨集定義中的形式引數a b,即用 ...