巨集和函式的區別

2021-07-24 08:27:03 字數 2041 閱讀 2568

語言學習過程中,我們總會使用函式和巨集,以提高**可讀性,而要想更好的使用它們,就得了解清楚巨集和函式的區別,下面我們就來細數一下巨集和函式到底有什麼不同:

1.**長度不同。當執行程式時,在預處理階段,巨集**被插入到程式中,使程式的長度大幅度增長,

下面這個例子是在只有乙個巨集的情況下:

#include#define printf dowhile(0);

int main()

下面是預處理後的**。這裡只有乙個巨集,大家想,如果有長且多個巨集,顯而易見**會顯得十分臃腫。而函式只需要在用的時候呼叫函式**就可以了,這樣就大大的提高了**的可讀性。

2 .執行速度不同。程式執行時,**先被讀入儲存器內,在經過cpu處理執行後結果顯示輸出,巨集**在預處理階段就被插入到程式中,再經過cpu處理輸出結果,但如果是函式的話,當程式遇到函式呼叫時,cpu要先去呼叫這個函式後再使用,使用完畢後再返回主程式中,這樣一來,無形中就增加了程式執行的時間,所以相比之下,巨集的執行速度比函式快。(詳細過程參見部落格:從**到可執行程式的蛻變之路)

3.操作符優先順序不同。巨集引數的求值是在所有周圍的表示式的上下文環境裡,除非給他們加上括號,否則臨近操作符的優先順序可能會產生不可預料的結果;而函式的引數只在函式呼叫時求值一次,它的結果值傳遞給函式,表示式的求值結果更容易**。

下面舉個例子:

#include#define square(x) x*x

int main()

這個**毋庸置疑,輸出9,那麼如果把squart的引數a換成a+1呢?大家可能會說那當然是16了啊,4的平方嘛!開始我也這麼想來著!ok,下面我們來看一下預處理後的**:

顯然巨集替換到**當中以後x=3+1,當3+1*3+1時,因為操作符優先順序問題,結果並不符合預期,所以一般情況下,定義巨集的時候我們會給巨集的每乙個引數以及引數整體加上圓括號,即:

#define square(x) ((x)*(x))
以保證**安全性。

4.引數求值次數不同。引數每次用於巨集定義時,都將重新求值。由於多次求值,具有***的引數可能會產生一些不可預料的結果。比如下面這個引數求值問題:

#include#define max(x,y) ((x)>(y)?(x):(y))

int main()

這個**的執行結果是:6 10 9,其中較大的數被加了兩次,較小的數被加了一次。

副作⽤並不僅限於修改變數的值,

getchar

()也會產⽣副作⽤。調⽤這個函式將

」 消耗

「 輸⼊的⼀個字元

而引數在函式被呼叫前只求值一次,在函式中多次使用引數不會導致多種求值過程,引數***也就沒有發揮作用的餘地。

5.引數型別不同。巨集和型別無關,只要對引數的操作合法,就可以使用任意引數型別。

比如這個**:

#include#define max(x,y) ((x)>(y)?(x):(y))

int main()

3.4和4相比較,結果輸出較大的數4。

這裡乙個數是浮點型,乙個是整形。

而函式的引數與型別有關,如果引數型別不同,就需要使用不同的函式,即使他們執行的任務是相同的。

再比如這個**:

#define malloc( n, type) \

( ( type *) malloc ( (n) * sizeof( type ) ) )

int *pi = malloc( 25, int );

這個巨集的第二個引數是一種型別,而對於函式來說,型別是無法作為函式引數進行傳遞的。

如有錯誤,歡迎指出,一起交流學習!

巨集和函式的區別

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

巨集和函式的區別

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

巨集和函式的區別

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