1. 程式人生 > >巨集函式和普通函式的區別

巨集函式和普通函式的區別

#define S(a,b) a*b


area=S(3,2)

int S(int a,int b)
{ int s;
  s=a*b;
  return(s);
}
這兩個有什麼區別


為了提高程式的效率,我們用define來定義一個函式,這樣在頻繁呼叫的時候就不會有函式呼叫的開銷了,這就是巨集函式,但巨集定義只是把S(a,b)簡單地替換成a*b,這樣會產生問題,最典型的兩種:

1.缺括號,比如aera=S(x+y,x-y),會被替換成x+y*x-y

2.自增運算子

定義巨集

#define S(a) (a)*(a)

結果S(a++),變成(a++)*(a++)這個大家都知道,在不同編譯環境下會有不同結果。

也就是說,巨集只是編譯前簡單替換程式碼內容,而函式真正產生程式碼。

巨集是編譯期的,函式是執行期的;

巨集不是實體,而函式是一個可定址的實體;

巨集只是編譯期替換,在程式裡每遇到S(a,b),就用a*b代替,a和b兩個實體並沒有由巨集實際產生,而函式S會在棧中定義兩個物件a和b。

巨集沒有生存期、作用域之類的概念,而函式就有。

函式在執行過程中會在棧中產生函式呼叫過程活動記錄,而巨集則沒有。