預處理宏的優缺點
在軟件開發過程中,經常有一些常用或者通用的功能或者代碼段,這些功能既可以寫成函數,也可以封裝成為宏定義。那么究竟是用函數好,還是宏定義好?
我們還是看上一篇文章中引用的比較大小的例子:
#define MAX( a, b) ( (a) > (b) ? (a) : (b) )
//把它用函數來實現:
int max( int a, int b)
{
return (a > b ? a : b);
}
如果我們在程序中將要使用比較大小的函數,我們顯然會選用上面的宏定義,理由如下:
首先,函數調用會帶來額外的開銷,他需要開辟新的棧空間,記錄返回值,還需要將形參壓入棧中,函數返回時還需要釋放堆棧空間。
這樣的開銷不僅會讓程序執行效率變低,代碼量也會大大增加,因此使用上面的宏函數做文本替代就顯得更明智。
其次,函數的形參被聲明成了一個特定的類型,如例子中是 int,這樣如果我們軟件中需要使用浮點型的比較大小,我們就不得不重寫一個函數,從這一點也可以看到宏函數的優勢。
因為是文本的替換,因此他與類型也沒有關系,不過類型不對應,會在編譯階段的時候報錯,這點還是具備利用價值的。
另外,還有一些任務根本無法用函數實現****,但是用宏定義卻很好實現。
比如參數類型沒法作為參數傳遞給函數,但是可以把參數類型傳遞給帶參的宏。
看下面的例子:
#define MALLOC(n, type )((type ) malloc((n)sizeof( type )))
利用這個宏,我們就可以為任何類型分配一段我們指定的空間大小,并返回指向這段空間的指針。我們可以觀察一下這個宏確切的工作過程:
int *ptr;
ptr = MALLOC ( 5, int );
//將這宏展開以后的結果:
ptr = (int *) malloc ((5) * sizeof(int));
這個例子是宏定義的經典應用之一,完成了函數不能完成的功能,但是宏定義也不能濫用,通常,如果相同的代碼需要出現在程序的幾個地方,更好的方法是把它實現為一個函數。
-
函數
+關注
關注
3文章
4417瀏覽量
67524 -
代碼
+關注
關注
30文章
4968瀏覽量
73992 -
預處理
+關注
關注
0文章
33瀏覽量
10814
發布評論請先 登錄
arm嵌入式主板優缺點
C語言中實現函數宏的三種方式
電能質量在線監測裝置測溫功能的無線通信方式的優缺點有哪些?
C語言宏拼接運算符典型使用
不同類型的電能質量在線監測裝置數據存儲方式有哪些優缺點?
數據預處理軟核加速模塊設計
無線局域網的優缺點和使用要點
鋰電池制造 | 電芯預處理工藝的步驟詳解
超級電容對比鋰電池的優缺點
商業云手機核心優缺點分析
PCBA 表面處理:優缺點大揭秘,應用場景全解析
FPGA Verilog HDL語法之編譯預處理
預處理宏的優缺點有哪些
評論