宏就是文字展开,实际中可以展开写出来发现错误。
6.1 不能忽视宏定义中的空格
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
T2 a,b;