帶參數宏定義和函數的區別

#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
area=S(3,2)

儘量少使用宏定義。宏定義是把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。

宏沒有生存期、作用域之類的概念,而函數就有。

函數在運行過程中會在棧中產生函數調用過程活動記錄,而宏則沒有。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章