宏定义的使用
2020-06-06 本文已影响0人
晓茫
本文仅记录下看源码过程中遇到的C宏的一些说明
- 运算符优先级问题
#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) //确保优先级
- 分号吞噬问题
#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)
不管如何被展开都不会问题
- 宏参数重复调用
#define min(X, Y) ((X) < (Y) ? (X) : (Y))
min(getA(1),getB(2)) //展开后 为 getA(1)<getB(2)?getA(1):getB(2) 有的时候很难确定 getA(1)两次调用返回的值是一致的