巨集和函式的區別

2021-07-23 19:03:48 字數 1400 閱讀 5202

巨集定義又稱巨集代替,巨集替換,其宣告方式為:#define name(parameter-list) stuff。其中,parameter-list(引數列表)是乙個有逗號分隔的符號列表,它們可能出現在stuff中。必須注意的是,引數列表的左括號必須與name緊密相連,如果兩者之間有任何空格存在,則引數列表會被解釋為stuff的一部分。#define機制包括了乙個規定,允許把引數替換到文字中,這種實現通常稱為巨集或定義巨集。此外,還要注意,在使用巨集的時候,一定不不要吝嗇「()」,否則,巨集替換不會根據你所期待的那樣替換,如下所示。

#include

#include

#define mul(x) x*x

int main()

函式的定義就是函式體的實現。函式體就是乙個**塊,他在函式被呼叫的時候執行。函式定義的語法如下:

型別 函式名(形參)

**塊

對函式的呼叫規定為「單向值傳遞」,即只能將實參的值傳遞給形參,不能奢求形參值的改變從而使實參的值隨之改變,因為形參只是實參的乙份臨時拷貝,函式呼叫結束後,函式**塊這片記憶體隨之消失。同時,必須牢記不能返回棧指標。如下,例1,實現兩個數的交換,例2,實現字串拷貝。

//例1,實現兩個數的交換,錯誤的函式用法

#include

#include

void change(int a, int b)

int main()

//例2,實現字串拷貝,函式的錯誤用法,企圖返回棧指標

#include

#include

#include

#include

char * creatememory(int n)

int main()

1.巨集只佔編譯時間,函式呼叫則占用執行時間(分配單元,儲存現場,值傳遞,返回),每次執行都要載入,所以執行相對巨集會較慢。

2.使用巨集次數多時,巨集展開後源程式很長,因為每展開一次都使程式增長,但是執行起來比較快一點(這也不是絕對的,當有很多巨集展開,目標檔案很大,執行的時候執行時系統換頁頻繁,效率就會低下)。而函式呼叫不使源程式變長。

3.巨集定義很容易產生二意性,比如上述的例子。

4.函式的引數必須申明為一種特定的型別,所以它只能在型別合適的表示式上使用。然而,比如比較兩個數的大小並返回較大,可以這樣定義:#define max(a,b) ((a)>(b)?(a):(b)) ,這個巨集以用於任何可以用<、>操作符比較大小的型別。換句話說,巨集是與型別無關的。

5:呼叫函式只可得到乙個返回值,且有返回型別,而巨集沒有返回值和返回型別,但是用巨集可以設法得到幾個結果。

6:函式體內有bug,可以在函式體內打斷點除錯。如果巨集體內有bug,那麼在執行的時候是不能對巨集除錯的,即不能深入到巨集內部。

巨集和函式的區別

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

巨集和函式的區別

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

巨集和函式的區別

巨集和函式的區別 c語言中,巨集的用處也是十分廣泛,巨集是一種規則或模式,或稱語法替換 這種替換在預編譯時進行,稱作巨集展開。而函式函式就是一系列c語句的集合,為了完成某個會重複使用的特定功能。需要該功能的時候,直接呼叫該函式即可巨集和函式功能上有相同點,但是也有許多差異,在不同的場合做合適的選擇,...