首先告明出处:http://www.cnblogs.com/lizhenghn/p/3674430.html
do{…}while(0)的妙用
的确在工作中我们不常用到这个语法,一般都是for、while,看了这篇博文后还真是大有用处。
首先展示一下场景:
#define FUN() food1(); food2();
这句宏定义就是说调用FUN()宏的时候就带哦用后面两个函数,但是当出现如下情况时,就不能按照我们预想的那样去执行了!
if(a > 0)
FUN();
因为宏定义就是完全展开所以上面的情况就相当于
if(a > 0)
food1();
food2();
这样food2()就一定会被执行,所以不是我们预想的,像这样的情况我门对他用{}、;等方法都不能保证调用的时候会想我们预想的那样执行
然而此时,do···while(0)就展现了他的妙处
#define FUN() \
do{ \
food1(); \
food2(); \
}while(0) \
第二种妙用就是do···while(0)配合break;来避免使用goto语句(不要问我为什么要避免goto语法,小心被搞c++的人打死的!),这种就简单多了,直接上两段对比代码(copy原文code)
int foo()
{
somestruct *ptr = malloc(...);
dosomething...;
if(error)
goto END;
dosomething...;
END:
free(ptr);
return 0;
}
int foo
{
do{
somestruct *ptr = malloc(...);
dosomething...;
if(error)
break;
dosomething...;
}while(0);
free(ptr);
return 0;
}
原文中还有一些其它的功能,但是本感觉不太使用,就不在这里给出了