【linux内核】do_while0 的作用

参考了: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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值