您好,登錄后才能下訂單哦!
宏與函數的區別:
1、宏做的是簡單的字符串替換,不受類型限制;而函數是參數的傳遞,受到參數類型的限制。
2、宏體替換宏名是在編譯之前就完成的,函數參數的調用是在函數執行時將實參傳給形參的。
3、宏參數的替換是不經過計算的,有可能會帶有副作用,所以我們在寫宏體的時候一般在能加括號的地方都不要吝嗇括號,但有時候這也不能解決副作用的問題。函數在傳參時傳的是值,不會產生副作用。
#define MAX (a,b) ((a)>(b)?(a):(b)) int main() { int a = 10; int b = 20; int ret = MAX (a++, b++); printf( "%d %d %d\n" , a, b, ret); system( "pause"); return 0; }
結果是: 11 22 21
這就是由宏所帶的副作用造成的,因為宏進行的是字符串的替換,替換后的式子是:((a++)>(b++)?(a++):(b++))。如果是函數,則傳遞的是值,就不會產生副作用。
4、因為函數是在執行期間調用的,所以可以進行調試;宏在編譯前完成的,所以不可以進行調試。
5、函數支持遞歸,宏不支持。
6、函數在調用時會產生時間和空間上的開銷;宏在調用時則沒有,因為宏進行的只是簡單的字符串替換。
7、如果使用宏比較多,宏體在展開時會產生大量的代碼,大大降低運行時間。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。