我們由問題展開:
1.什麼是巨集函式?
2.巨集函式與普通函式的相同點?不同點?
3.巨集函式與普通函式的優缺點?
在這之前看一下巨集的定義:
巨集是根據一系列預定義的規則替換一定的文字模式。
#define buffer_size 1024
預處理階段, fun=(char )malloc(buffer_size); 會被替換成 fun=(char )malloc(1024);
#define numbers 1,\
2,\ 3
預處理階段int x=;會被擴充套件為int x=;
巨集名之後帶括號的巨集被認為是巨集函式。
#define add(a,b) (a+b)
y=add(1,2);會被擴充套件為y=1+2;
相同點:
若巨集是一種替換工具,那麼相同點就只有計算結果了。
不同點:
巨集函式是在預處理階段進行文字搜尋和替換。而普通函式是在編譯過程會分配空間,建立棧幀,傳參,傳返回值等。
巨集函式的優點:沒有普通函式儲存暫存器和引數傳遞,返回值傳遞的開銷,展開後的**效率高,速度快。
缺點:1.展開後的**體積大
2.巨集函式的替換是純文字替換,c預處理器不對巨集做任何語法檢查,就像缺個括號等預處理器是不管的
#define add(a,b) a+b
int main()
我們原本是想計算(1+2)* 2的值,但是實際上計算的是1+2 *2的值,所以就出現了計算錯誤。
普通函式的優點:
1.**體積小
2.降低程式的複雜性,使程式更容易維護
缺點:程式呼叫普通函式會開闢一片空間,進行暫存器儲存,傳值的操作,降低了**效率
雖然在**執行速度上巨集函式會更勝一籌,但是《在google程式設計規範》和《effective c++》是不推薦使用巨集的,因為巨集的使用在某種程度上會降低程式的可維護性,還可能會出現一些莫名其妙的錯誤,而找不到源頭。如果對巨集的用法不是很熟練,還是避免使用巨集定義。
巨集函式 內聯函式 普通函式的區別
剛剛面世完,上來就問巨集函式和普通函式的區別,整理一下 本文為本人的第一篇部落格,各位大蝦多多指點 巨集函式 在c語言中用的比較多,c 中用的比較少,巨集函式只是在預編譯階段做簡單的替換,所以不會為函式呼叫帶來額外的開銷 不必開闢一段棧空間 沒了這種開銷,就可以提高 執行的效率。但是僅僅簡單的替換也...
巨集定義函式 普通函式 內聯函式區別
巨集定義函式 例子 單行 define max a,b a b a b 多行 define malloc n,type type malloc n sizeof type 對於第乙個函式,如果用普通函式,該怎樣寫?int max int a,int b 很顯然,我們不會選擇用函式來完成這個任務,原因...
巨集定義 內聯函式 普通函式的區別
巨集定義和內聯函式的區別 第一 巨集定義時在預處理階段進行 替換,而內聯函式在編譯階段進行 替換。第二 巨集定義沒有型別檢查,而內聯函式有型別檢查。內聯函式和普通函式最大的區別是在內部實現方面上 普通函式在被呼叫時,系統首先要跳躍到該函式的入口位址,執行函式體,執行完成後,再返回到函式呼叫的地方,函...