#define MAX(a,b) ((a)>(b)?(a):(b))

int MAX1(int a,int b)

{

return a>b?a:b;

}

1)巨集定義函式沒有引數型別也不做型別檢查,預編譯階段直接進行巨集替換。所以對上面的巨集定義函式他可以比較不同型別的資料大小,而普通函式則只能比較形參型別的大小。

2)巨集定義函式時一定要注意括號的存在和匹配,有時會因為 括號的不存在就會導致函式在計算的時候出現優先順序錯誤的現象繼而導致整個程式出錯。

3)呼叫巨集定義函式和普通函式生成的指令不同。


普通函式每次編譯都要生成指令並且在每次呼叫時都要生成傳參指令和call指令。而巨集定義函式編譯時則不生成任何指令,

但在呼叫時和函式體一樣都會生成傳參指令和call指令以及其他的一些指令, 所以在使用巨集定義函式時編譯生成的目標檔案

過大。

4)巨集定義函式有時會導致程式碼的執行效率變低,例如:

#include <iostream>

using namespace std;

int a[6] = {32,12,45,17,65,48};

#define max(n) (a[n]>max(n-1)?a[n]:max(n-1))

int max1(int n)

{

return n==0?a[0]:max(a[n]>max(n-1)?a[n]:max(n-1));

}

int main()

{

cout<<max(4)<<endl;

cout<<max1(4)<<endl;

}

在這種情況下,如果我們呼叫的是普通函式則只需通過遞迴就可以得到整形陣列中最大的那個數並且時間複雜度為O(n),

但如果呼叫的是巨集定義函式就會發現max(n-1)在呼叫一次巨集定義函式max(n)時會被算兩遍。現在的資料量還不是很大也許

你會覺得不就是兩遍這有什麼大不了的,但是當我們的資料達到一個非常大的資料量的時候你應該就會明白巨集定義函式

與普通函式的時間複雜度的差異到底有多大了。