C語言巨集和函式的區別

2021-08-19 13:25:52 字數 1206 閱讀 5032

首先巨集的使用:

有標準巨集和巨集函式

標準巨集就是將乙個大寫字母或單詞定義成不可改變的常量,使用時直接文字替換,如:

#define n  1000
巨集函式是將乙個函式簡化為大寫的字母或單詞,多次使用時會很方便。要注意的是巨集函式裡邊,表示式和引數都要帶上圓括號,否則可能會出現由於優先順序或求值順序而導致的bug,比如:

假設:x=2+3

#define m(x) x*x

則此時輸出結果為2+3*2+3=11

#define m(x) (x)*(x)

輸出結果為(2+3)*(2+3)=25

#define a(x) (x)+(x)

int result=10*a(x)

此時輸出結果為10*(2+3)+(2+3)=55

#define a(x) ((x)+(x))

此時輸出結果為10*((2+3)+(2+3))=100

所以在定義巨集函式時一定要給表示式和引數都加上圓括號。

可以用來將巨集引數變成對應的字串,如:

#define test(format,value) print("the val of "#value" is "format"\n",value)

int i=10;

test("%d",i+3); //#value被預處理成為 i+3

輸出結果是:the val of i+3 if 13

可以把##兩邊的符號合成為乙個符號,但合成後的符號必須是合法的識別符號。

#define add(n,value)  sum##n+=value;

add(6,9);

輸出為:sum6+=9;

巨集的優勢:     對於小型計算,巨集在規模和速度方面比函式有優勢。

巨集的引數是和型別無關的,但這既是它的優勢也是它的劣勢。

巨集的引數可以是型別,也可以是另外乙個巨集的引數。

劣勢:     巨集是不能除錯的。

引數與型別無關,所以不夠嚴謹。

由於呼叫巨集時是文字替換,所以多次呼叫的話可能會大幅增加程式長度。

函式的優勢:   每次呼叫你都是呼叫同乙個地方的**。

引數的輔佐用不會導致多次求值引發的錯誤,且結果容易**。

劣勢:   函式呼叫和返回時會有額外開銷

相對與巨集,函式的速度稍慢。

C語言 巨集和函式的區別

1,巨集 巨集定義將乙個識別符號 定義為乙個字串,源程式 中的該識別符號均以指定的字串來代替。巨集的書寫形式 define 巨集名 參數列 巨集體 2,函式 函式有庫函式和自己編寫的函式,庫函式是用來定義一些經常用的大家都知道的函式,自定義的函式是大家為了實現一些功能來自己編寫的函式 3,巨集和函式...

巨集和函式的區別(C語言)

一 長度 1 每次使用時,巨集 都被插入到程式中。除了非常小的巨集之外,程式的長度將大幅度增長。2 函式 只出現於乙個地方,每次使用這個函式時,都呼叫那個地方的同乙份 二 執行速度 1 define 巨集 更快。2 函式存在函式呼叫或返回的額外開銷。三 操作符優先順序 1 巨集引數的求值是在所有週期...

在c語言中巨集和函式的區別

關於c語言中的巨集,自己來總結一下。簡單來說,巨集就是在c語言中簡單的文字替換,這是簡單的理解,嚴格的說不是很準確,因為在巨集中存在乙個文字條件編譯,所以有一定的判斷,巨集是在c語言中的預處理階段就已經處理完成。函式呢,就要分為兩種了。第一種封裝成庫。如果函式在動態庫中,那麼呼叫就是在函式執行階段 ...