首先看一下以下的三个陷阱:
1.
- #define T(a) a+a
- 调用:3*T(4)
- 替换结果:3*4+4
- 修改:#define T(a) (a+a)
2.
- #define T(a) (a*a)
- 调用1:T(++a)
- 替换结果:(++a * ++a)
- 修改:注意调用函数宏时,不要进行++,–运算
- 调用2:T(3+4)
- 替换结果:(3+4*3+4)
- 修改:#define T(a) ((a)*(a))
3.
- #define T(a,b) 语句1;语句2;
- 调用:if(1)
- T(3,4)
- 替换结果:if(1)
- 语句1;
- 语句2;;
- 修改:
- #define T(a,b)
- do{
- 语句1;
- 语句2;
- }while(0)
以下是定义函数宏的注意事项:
- 1.形参使用()进行运算以保证期望的优先级
- 2.整个宏使用()以保证优先级
- 3.多句使用do_while结构
- do{
- …
- }while(0)
- 4.避免使用++,–作为形参调用函数宏
函数宏的常见陷阱与使用注意事项