我們由問題展開:

1.什麼是巨集函式?

2.巨集函式與普通函式的相同點?不同點?

3.巨集函式與普通函式的優缺點?

什麼是巨集函式?

在這之前看一下巨集的定義:

巨集

巨集是根據一系列預定義的規則替換一定的文字模式。

#define BUFFER_SIZE 1024

預處理階段, fun=(char )malloc(BUFFER_SIZE); 會被替換成 fun=(char )malloc(1024);

#define NUMBERS 1,\
                2,\
                3

預處理階段int x[]={NUMBERS}; 會被擴充套件為 int x[]={1,2,3};

巨集函式

巨集名之後帶括號的巨集被認為是巨集函式。

#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++》是不推薦使用巨集的,因為巨集的使用在某種程度上會降低程式的可維護性,還可能會出現一些莫名其妙的錯誤,而找不到源頭。如果對巨集的用法不是很熟練,還是避免使用巨集定義。