免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: vivian2086
打印 上一主题 下一主题

[C] 有人用goto 处理错误么 [复制链接]

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
21 [报告]
发表于 2011-03-08 13:06 |只看该作者
我说要是说我从来没有用过goto,你们肯定会笑话我,

我觉着乱,哈哈。

论坛徽章:
0
22 [报告]
发表于 2011-03-08 13:54 |只看该作者
还有,如果你的函数写成这样,我觉得有可能设计不合理了。 起码bar2依赖某个会在bar1改变的变量, ...
donotblock 发表于 2011-03-08 12:55



    你看得太仔细。。。那些是为了搭个结构,我承认这结构搭得不够简单没有岐义,但的确只是个摆设,我想说的只是有个loop 在那

论坛徽章:
0
23 [报告]
发表于 2011-03-08 13:56 |只看该作者
回复 15# amarant


    好像就是在内核模块学到的,不记得了,也不知道里面用得多不多

论坛徽章:
0
24 [报告]
发表于 2011-03-08 14:20 |只看该作者
林锐放的屁你也当真, 他是在空想 goto的用法~~
三月廿七 发表于 2011-03-08 13:01



    林锐啥的我没看过,我自己就是这么用的...

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
25 [报告]
发表于 2011-03-08 14:30 |只看该作者
搞那么复杂干嘛

  1. ......
  2. if( bar1() >= 0 &&  bar2() >= 0 )
  3.          return 0;
  4. ......
复制代码

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
26 [报告]
发表于 2011-03-08 14:33 |只看该作者
一般情况下,不建议由子函数释放资源

论坛徽章:
0
27 [报告]
发表于 2011-03-08 14:39 |只看该作者
多层循环?一层一层出去不是更好吗?直接就跳出去了才不好吧。
我是尽量不用goto,exit()之类的

论坛徽章:
0
28 [报告]
发表于 2011-03-08 15:00 |只看该作者
本帖最后由 csern 于 2011-03-08 15:03 编辑

  1. int foo(void)
  2. {
  3.         int err;
  4.         int fd1, fd2;
  5.         void *ptr;

  6.         fd1 = open(...);
  7.         if (fd1 == -1) {
  8.                 err = -errno;
  9.                 goto out;
  10.         }      

  11.         fd2 = open(...);
  12.         if (fd2 == -1) {
  13.                 err = -errno;
  14.                 goto close_1;
  15.         }      

  16.         ptr = malloc(...);
  17.         if (!ptr) {
  18.                 err = -ENOMEN;
  19.                 goto close_2;
  20.         }
  21.                
  22.         /* ... */
  23.         
  24.         err = bar(...);
  25.         if (err)
  26.                 goto free_ptr;
  27.                
  28.         /* ... */
  29.         
  30.         err = 0;
  31. free_ptr:
  32.         free(ptr);
  33. close_2:
  34.         close(fd2);
  35. close_1:
  36.         close(fd1);
  37. out:   
  38.         return err;
  39. }
复制代码
经常这么写

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
29 [报告]
发表于 2011-03-08 18:19 |只看该作者
本帖最后由 nizvoo 于 2011-03-09 01:08 编辑
有资源需要释放的函数里面,用goto 很爽啊,比如

============
写法一:
int foo()
{

...
vivian2086 发表于 2011-03-08 11:02



   
要不你分成两个函数
  1. int foo2(int fd, char* p)
  2. {
  3.      if( bar1() < 0 ){      
  4.           return -1;
  5.      }
  6.      

  7.      if( bar2() < 0 ){         
  8.           return -1
  9.      }

  10.      return 0;

  11. }

  12. int foo()
  13. {
  14.      int ret = 0;

  15.      char *p = malloc();

  16.      if (!p) return -1;

  17.      int fd = open();

  18.      if (fd) {

  19.          if (foo2(fd, p) == -1)
  20.                 ret = -1;

  21.        fclose(fd);
  22.     } else
  23.        ret = -1;

  24.     free(p);
  25.    

  26.      return ret;
  27.      
  28. }


复制代码

论坛徽章:
0
30 [报告]
发表于 2011-03-08 19:05 |只看该作者
回复 1# vivian2086


    linux驱动程序的probe方法一般使用GOTO作为错误的处理,可以回滚已经分配的资源。汇编里有用GOTO也较多,执行流程很复杂的程序里用GOTO较难容易错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP