巧妙的運用宏和函數寫好你的C代碼

 究竟是用函數好,還是宏定義好?

比較兩個數或者表達式大小,首先把它寫成宏定義:

eg:

#include<stdio.h>

#include<stdlib.h>

#define MAX(x,y) ((x) > (y)? (a) : (b))


int main()

{

int a = 2, b = 4;

int m = 0;

m = MAX(2, 4);

printf("%d\n", m);

system("pause");

return 0;

}

宏只是字符的替換,在預處理階段就替換到代碼當中去了。)

  函數來實現:

    //eg:

#include <stdio.h>
#include <stdlib.h>


int MAX(int x, int y)
{
 int max = 0;
 max = x > y ? x : y;
 return(max);
}
int main()
{
 int max=0,a = 0, b = 0;
 scanf_s("%d%d", &a, &b);
 max=MAX(a, b);
 printf("max=%d\n", max);
 system("pause");
 return 0;

}

(函數在使用的過程中每次都要分配空間,每次都要有進棧出棧的操作降低了代碼的效率)

    這裏不會用函數原因有三個:首先,函數調用會帶來額外的開銷,它需要 開闢一片棧空間,記錄返回地址,將形參壓棧,從函數返回還要釋放堆棧。這種開銷不僅會降低代碼效率,而且代碼量也會大大增加,而使用宏定義則在代碼規模和 速度方面都比函數更勝一籌;其次,函數的參數必須被聲明爲一種特定的類型,所以它只能在類型合適的表達式上使用,我們如果要比較兩個浮點型的大小,就不得 不再寫一個專門針對浮點型的比較函數。三就是代碼結構比較簡單,使用宏不會顯得累贅,且效率高反之,上面的那個宏定義可以用於整形、長整形、單浮點型、雙浮點型以及其他任何可以用“>”操作符比較值大小 的類型,也就是說,宏是與類型無關的。

    但是宏在代碼比較長的情況下不宜閱讀,也就給理解增加了難度性,也會使得代碼顯得長而累贅,但是函數不會,它結構簡明,每次調用同一個函數都會回到同一個人地方去,顯得簡潔明瞭

  這段總結摘自《C和指針》和自己的理解。

(圖來自網絡:)

200912221214440.jpg




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