首先看一下以下的三个陷阱:

1.

  1. #define T(a) a+a   
  2. 调用:3*T(4)   
  3. 替换结果:3*4+4  
  4. 修改:#define T(a) (a+a)  

2.

  1. #define T(a) (a*a)   
  2. 调用1:T(++a)   
  3. 替换结果:(++a * ++a)   
  4. 修改:注意调用函数宏时,不要进行++,–运算   
  5.            
  6. 调用2:T(3+4)   
  7. 替换结果:(3+4*3+4)   
  8. 修改:#define T(a) ((a)*(a))  

3.

  1. #define T(a,b) 语句1;语句2;   
  2. 调用:if(1)   
  3.     T(3,4)   
  4. 替换结果:if(1)   
  5.         语句1;   
  6.     语句2;;   
  7. 修改:   
  8. #define T(a,b)     
  9. do{                    
  10.     语句1;           
  11.     语句2;           
  12. }while(0)     

以下是定义函数宏的注意事项:

  •     1.形参使用()进行运算以保证期望的优先级
  •     2.整个宏使用()以保证优先级
  •     3.多句使用do_while结构
  •         do{
  •             …
  •          }while(0)
  •     4.避免使用++,–作为形参调用函数宏
函数宏的常见陷阱与使用注意事项

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据