宏就是文字展開,實際中能夠展開寫出來發現錯誤。
6.2 宏并非函數
宏定義一個函數時,
1、要把每一個參數用括號括起來
2、同一時候也要把整個表達式括起來。
3、要確保宏中的參數沒有副作用
#define ?max(a,b) ((a)>(b)?
(a):(b))
max(big,x[i++]),這時++有可能被計算兩次,產生了副作用。
宏有可能由于自增減操作產生副作用。也有可能產生很龐大的表達式。
消除if else的副作用:
#define assert(e) \
((void)((e)||_assert_error(__FILE__,__LINE__)))
6.4 宏并非類型定義
#define T1 struct foo *
typedef struct foo *T2
T1 a,b; ??//聲明被擴展為struct?foo *a,b; ?b不是指針 。
T2 a,b;