巨集函式與普通函式的區別
阿新 • • 發佈:2019-01-03
我們由問題展開:
1.什麼是巨集函式?
2.巨集函式與普通函式的相同點?不同點?
3.巨集函式與普通函式的優缺點?
什麼是巨集函式?
在這之前看一下巨集的定義:
巨集
巨集是根據一系列預定義的規則替換一定的文字模式。
#define BUFFER_SIZE 1024
預處理階段, fun=(char )malloc(BUFFER_SIZE); 會被替換成 fun=(char )malloc(1024);
#define NUMBERS 1,\
2,\
3
預處理階段int x[]={NUMBERS};
巨集函式
巨集名之後帶括號的巨集被認為是巨集函式。
#define add(a,b) (a+b)
y=add(1,2); 會被擴充套件為y=1+2;
巨集函式與普通函式的相同點?不同點?
相同點:
若巨集是一種替換工具,那麼相同點就只有計算結果了。
不同點:
巨集函式是在預處理階段進行文字搜尋和替換。而普通函式是在編譯過程會分配空間,建立棧幀,傳參,傳返回值等。
巨集函式與普通函式的優缺點?
巨集函式的優點:沒有普通函式儲存暫存器和引數傳遞,返回值傳遞的開銷,展開後的程式碼效率高,速度快。
缺點:
1.展開後的程式碼體積大
2.巨集函式的替換是純文字替換,C前處理器不對巨集做任何語法檢查,就像缺個括號等前處理器是不管的
#define add(a,b) a+b
int main()
{
int t=add(1,2)*2;
printf("%d",t);
return 0;
}
我們原本是想計算(1+2)* 2的值,但是實際上計算的是1+2 *2的值,所以就出現了計算錯誤。
普通函式的優點:
1.程式碼體積小
2.降低程式的複雜性,使程式更容易維護
缺點:
程式呼叫普通函式會開闢一片空間,進行暫存器儲存,傳值的操作,降低了程式碼效率
雖然在程式碼執行速度上巨集函式會更勝一籌,但是《在google程式設計規範》和《Effective C++》是不推薦使用巨集的,因為巨集的使用在某種程度上會降低程式的可維護性,還可能會出現一些莫名其妙的錯誤,而找不到源頭。如果對巨集的用法不是很熟練,還是避免使用巨集定義。