linux命令行中的goto_linux的C语言编程技巧,不得不学啊!do 「 … 」 while (0)

ebdbfe40aa88388de62b2ce950ce84f6.png

今天在阅读linux代码的时候,看到linux很多代码都用了:刚开始以为这是多此一举,既然是while(0),那么写和没写都是一个样。但是在好奇心的驱动下,查阅了许多资料后,发现,这句代码真的是“神”一般的操作,那么它到底有什么作用呢?

一,避免使用goto控制流程:

我们在一些函数中,如果在退出前,需要一些清理工作,正常情况下,我们可以使用goto来实现,比如:

int foo(){    somestruct *ptr = malloc(...);    dosomething...;    if(error)        goto END;    dosomething...;END:    free(ptr);    return 0;}但是由于goto

但是由于goto不符合结构化设计,很多人都不倡导使用,这时候就可以使用do while了:

int foo(){    somestruct *ptr = malloc(...);    do    {        dosomething...;        if(error)            break;        dosomething...;    } while(0);    free(ptr);    return 0;}

这里将函数主体部分使用do{...}while(0)包含起来,使用break来代替goto,后续的清理工作在while之后,现在既能达到同样的效果,而且代码的可读性、可维护性都要比上面的goto代码好的多了。

二.避免宏定义的一些编译或者错误:

我们假设定义一个宏:

#define DELETE_IT(p) delete p; p = NULL; 

那么在下面的代码中:

If(NULL!=p)   DELETE_IT(p)else   .......

宏会被展开成:

If(NULL!=p)   delete p; p=NULL;else    ........

那么就存在两个问题:

1,编译错误:因为if分支后面有两个语句,导致else分支没有对应的if

2,逻辑错误:假设没有else分支,则SAFE_FREE中的第二个语句无论if测试是否通过,都会执行,这个就很严重

那么有什么办法解决这个问题吗?答案是有,do while就是用来解决这个问题的:

#define DELETE_IT(p) do { delete p; p=NULL; } while(0);

这样定义,展开后,就变成:

If(NULL!=p)  do { free(p); p=NULL; } while(0);else   .......

这样就可以避免上面的问题了

即学即用的技巧,可以在代码秀一下了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值