宏定义的使用

本文仅记录下看源码过程中遇到的C宏的一些说明

  1. 运算符优先级问题
#define mutil(x,y) x*y
示例:
1. mutil(2,3) 展开为 2*3
2. mutil(1+2,3) 展开为  1+2*3 ,优先级有问题

正确方式: #define  mutil(x,y) (x)*(y) //确保优先级 
  1. 分号吞噬问题
#define foo(x) bar(x); baz(x)

这种方式的问题是,因为有展开上上下文问题

foo(1) //展开 为 bar(1);baz(1) 正确
if(show) foo(1) // 展开为 if(show) bar1(1);baz(1) 丢失了baz的执行 

#define foo(x) { bar(x); baz(x)} 这样能否解决问题?
反例:
if (!feral)  
    foo(wolf);  
else  
    bin(wolf);

展开后:

if (!feral) {  
    bar(wolf);  
    baz(wolf);  
};  //语法问题哦
else  
    bin(wolf);  

//为了不收调用上下文的分号和{}之类的影响
正确的定义
#define foo(x)  do{ bar(x); baz(x); }while(0)
不管如何被展开都不会问题
  1. 宏参数重复调用
#define min(X, Y)  ((X) < (Y) ? (X) : (Y))
min(getA(1),getB(2))  //展开后 为 getA(1)

你可能感兴趣的:(宏定义的使用)