1. 分号的一致性(派生原因)
假设你需要释放一段内存
#define SAFE_FREE(x) if (x) { free(x); x = null;}
你在使用这个宏的时候,就变成了这样
if (...)
SAFE_FREE(x)
else
stuff();
而使用do while(0)
后,分号就可以加在后面了。 😃
#define SAFE_FREE(x) do { if (x) {free(x); x = null;}} while(0)
2. 定义较为复杂的宏(最主要的原因)
假设你需要定义的宏
#define DOSOMETHING()\
foo1(); \
foo2();
而当使用的时候,可能展开错误
if (a >0)
DOSOMETHING();
展开成为了
if (a > 0)
foo1();
foo2();
3. 避免空宏引起的warning
#define EMPTYMICRO do{} while(0)
4. 实现复杂的函数
在一个块内定义的变量不会影响其他作用域