巨集和函式的區別

2021-08-27 13:57:10 字數 1138 閱讀 8880

巨集通常被應用於執行簡單的運算。比如在兩個數中找出較大的乙個。

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

那為什麼不用函式來完成這個任務? 原因有二:

1. 用於呼叫函式和從函式返回的**可能比實際執行這個小型計算工作所需要的時間更更多。所 以巨集比函式在程式的規模和速度方面更勝⼀一籌。

2. 更更為重要的是函式的引數必須宣告為特定的型別。所以函式只能在型別合適的表示式上使用。反之這個巨集怎可以適⽤用於整形、長整型、浮點型等可以用於》來比較的型別。巨集是型別無關的。

當然和函式相比巨集也有劣勢的地方:

1. 每次使用巨集的時候,乙份巨集定義的**將插入到程式中。除非巨集比較短,否則可能大幅度增 加程式的長度。

2. 巨集是沒法除錯的。 

3. 巨集由於型別無關,也就不夠嚴謹。 

4. 巨集可能會帶來運算子優先順序的問題,導致程容易出現錯。

巨集有時候可以做函式做不到的事情。比如:巨集的引數可以出現型別,但是函式做不到

#define malloc(num, type)\ 

(type *)malloc(num * sizeof(type)) 

... 

// 使用 

malloc(10, int);// 型別作為引數

// 預處理器替換之後:

(int *)malloc(10 * sizeof(int))

帶***的巨集引數

當巨集引數在巨集的定義中出現超過⼀一次的時候,如果引數帶有***,那麼你在使用這個巨集的時候 就可能出現危險,導致不可**的後果。***就是表示式求值的時候出現的永久性效果。

x+1;// 不帶*** 

x++;// 帶有***

命名約定

⼀一般來講函式的巨集的使用語法很相似。所以語言本身沒法幫我們區分二者。 那我們平時的乙個習慣是:

把巨集名全部大寫 函式名不要全部大寫

巨集和函式的乙個對比

巨集和函式的區別

巨集定義又稱巨集代替,巨集替換,其宣告方式為 define name parameter list stuff。其中,parameter list 引數列表 是乙個有逗號分隔的符號列表,它們可能出現在stuff中。必須注意的是,引數列表的左括號必須與name緊密相連,如果兩者之間有任何空格存在,則引...

巨集和函式的區別

巨集非常頻繁的運用於執行簡單的計算。那麼,為什麼不用函式呢?1.巨集在使用時比函式在程式的規模和速度更勝一籌。2.函式的引數必須申明為乙個特定的型別,於是它只能在型別合適的表示式使用。而巨集為無型別替換。而有些情況只能用巨集,就是按型別申請空間時。如 define malloc n,type typ...

巨集和函式的區別

語言學習過程中,我們總會使用函式和巨集,以提高 可讀性,而要想更好的使用它們,就得了解清楚巨集和函式的區別,下面我們就來細數一下巨集和函式到底有什麼不同 1.長度不同。當執行程式時,在預處理階段,巨集 被插入到程式中,使程式的長度大幅度增長,下面這個例子是在只有乙個巨集的情況下 include de...