首先巨集的使用:
有標準巨集和巨集函式
標準巨集就是將乙個大寫字母或單詞定義成不可改變的常量,使用時直接文字替換,如:
#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語言中的預處理階段就已經處理完成。函式呢,就要分為兩種了。第一種封裝成庫。如果函式在動態庫中,那麼呼叫就是在函式執行階段 ...