帶引數的巨集與函式的區別

2021-06-27 01:19:39 字數 588 閱讀 7776

1.函式呼叫時,先求出實參表示式的值,然後帶入形參。而使用帶參的巨集只是進行簡單的字元替換。

2.函式呼叫是在程式執行時處理的,分配臨時的記憶體單元;而巨集展開則是在編譯時進行的,在展開時並不分配記憶體單元,不進行值的傳遞處理,也沒有「返回值」的概念。

3.對函式中的實參和形參都要定義型別,二者的型別要求一致,如不一致,應進行型別轉換;而巨集不存在型別問題,巨集名無型別,它的引數也無型別,只是乙個符號代表,展開時帶入指定的字元即可。巨集定義時,字串可以是任何型別的資料。

4.呼叫函式只可得到乙個返回值,而用巨集可以設法得到幾個結果。

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

6.巨集替換不佔執行時間,只佔編譯時間;而函式呼叫則佔執行時間(分配單元、保留現場、值傳遞、返回)。

一般來說,用巨集來代表簡短的表示式比較合適。

有時使用巨集時會引起理解錯誤: 例:

#i nclude

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

void main()

{int i=3,j=2;

cout<

執行結果: 5

5  2

帶引數巨集和函式之間的區別

帶引數的巨集,一般形式如下 define 巨集名 參數列 字串 在函式中使用此巨集的時候,除了進行簡單的字串替換外,還要進行引數替換。如 define add x,y x y z add a,b 此句在函式內部 預處理後為 z a b 具體檢視方法就是檢視預處理結果 gcc e test.c o t...

帶引數的巨集與函式的不同

define pi 3.1415926 define s r pi r r 1 函式呼叫時,先求出實參表示式的值,然後代入形參,而使用帶引數的巨集只是進行簡單的字元替換。例如s a b 在巨集展開時並不求a b的值,而只將實參字元 a b替換形參r 2 函式呼叫是在程式執行時處理的,為形參分配臨時的...

含引數的巨集與函式的區別

含引數的巨集與函式的區別 巨集替換不佔執行時間,只佔編譯時間 而函式呼叫則佔執行時間 分配單元 保留現場 值傳遞 返回 所以每次執行都要載入所以執行起來比較慢一些。定義巨集的時候不要在巨集及其引數之間鍵入空格,因為巨集替換的時候會把你不經意打的空格當作巨集的一部分進去。在巨集定義中把每個引數都用括號...