究竟是用函數好,還是宏定義好?
比較兩個數或者表達式大小,首先把它寫成宏定義:
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和指針》和自己的理解。
(圖來自網絡:)