1. 程式人生 > >函式式的巨集定義和普通函式的區別

函式式的巨集定義和普通函式的區別

去華為面試,被問到了這個問題,答了其中一條,面試官很不滿意,回來總結下!                                                                      函式式的巨集定義:  #define MAX(a,b)  ((a)>(b))?(a):(b)                                                                                                          函式定義:MAX(a,b)                                                                                                                              {                                                                                                                                                                                                   if(a>b)                                                                                                                      return a;                                                                                                                                                             else                                     return b;                                                         }                                                   1.函式式的巨集定義沒有引數型別,只做形式上的替換。                                                                                                            2.函式式巨集定義一定要注意括號,詳解見我轉的關於#define那篇文章。                                   3.若函式引數為表示式,則普通函式的呼叫與函式式巨集定義的替換過程是不一樣的。                                                                    #define    MAX(a,b)   ((a)>(b)?(a):(b))    假如傳的a=k++,b=l++,則執行函式式的巨集定義的時候#define MAX(k++,l++) ((k++)>(l++) ?(k++):l++)  

這時自增運算就執行好多次了!函式的話只執行一次!                              4. 呼叫真正函式的程式碼和呼叫函式式巨集定義的程式碼編譯生成的指令不同。 
如果MAX是個普通函式,那麼它的函式體return a > b ? a : b; 要編譯生成指令,程式碼中出現的每次呼叫也要編譯生成傳參指令和call指令。而如果MAX是個函式式巨集定義,這個巨集定義本身倒不必編譯生成指令,但是程式碼中出現的每次呼叫編譯生成的指令都相當於一個函式體,而不是簡單的幾條傳參指令和call指令。所以,使用函式式巨集定義編譯生成的目標檔案會比較大