参考了:https://www.cnblogs.com/Sharemaker/p/17142670.html
最主要,就有几个作用:
- 用于定义一个作用域
- 避免goto语句的使用
定义一个作用域
其实就是,一些宏的逻辑比较复杂,多条语句,需要用 {} 括起来。
我们最容易想到的就是:
#define REPLACE_FUN() {funA(); funB();}
但是我们一般的编程习惯是在一个函数,或者语句后面添加一个 ; ,所以,如果使用上面的方法,有可能编译错误:
if(判断条件)
REPLACE_FUN();
//宏展开后为:
if(判断条件)
{
funA();
funB();
}; //此处替换后多一个分号;导致编译报错
为了,解决这个问题,我们如果使用 do while(0) 就能完美规避这个问题。
注意, do while(0) 后面不要加 分号
define REPLACE_FUN() \
do{ \
funA();\
funB();\
}while(0)\
//宏展开前为:
if(判断条件)
REPLACE_FUN();
//宏展开后为:
if(判断条件)
do{
funA();
funB();
}while(0); //根据判断条件,正确执行了一次逻辑
goto 的替代方案
goto 一般是用来做错误提前返回的:
void fun(int a)
{
if(1 == a)
{
...//todo
goto exit;
}
if(2 == a)
{
...//todo
goto exit;
}
exit:
...//todo
printf("a is error"\n);
}
但是有时候,我们还能用 do while 0,来做提前的返回,但是我个人觉得,这种代码不优雅:
int fun(int a)
{
do{
if(1 == a)
{
...//todo
break;
}
if(2 == a)
{
...//todo
break;
}
}while(0);
...//todo
printf("a is error"\n);
}