函式式的巨集定義和普通函式的區別
去華為面試,被問到了這個問題,答了其中一條,面試官很不滿意,回來總結下! 函式式的巨集定義: #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++)
如果MAX是個普通函式,那麼它的函式體return a > b ? a : b; 要編譯生成指令,程式碼中出現的每次呼叫也要編譯生成傳參指令和call指令。而如果MAX是個函式式巨集定義,這個巨集定義本身倒不必編譯生成指令,但是程式碼中出現的每次呼叫編譯生成的指令都相當於一個函式體,而不是簡單的幾條傳參指令和call指令。所以,使用函式式巨集定義編譯生成的目標檔案會比較大。