RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1010939
Accepted
Kto  To
Kto To
Asked:2020-08-07 14:24:52 +0000 UTC2020-08-07 14:24:52 +0000 UTC 2020-08-07 14:24:52 +0000 UTC

使用 goto 是否合理?

  • 772

我在我的项目中看到了以下代码:

#define chk(_f)        if ((status = _f) != 0) goto Error;

int init() {
    int status = 0;
    someStruct *s = NULL;
    chk(someFunc1());
    if (s = (someStruct)calloc(1, sizeof (*s)) == NULL) {
        chk(1);
    }
    chk(someFunc2());
    return 0;
Error :
    if (s)
        free(s);
    return status;
}

一般来说goto,今天使用这样的设计是否可取?

c
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. Best Answer
    Sergey
    2020-08-08T12:58:35Z2020-08-08T12:58:35Z

    为了不卷入宗教战争,我将仅举一个伪代码示例,其中使用goto(恕我直言)是非常合理的。驱动程序开发人员经常使用这种结构。所以:

    if (! Условие1) {rc = -1; goto err1};
    Действие1
    
    if (! Условие2) {rc = -2; goto err2};
    Действие2
    
    if (! Условие3) {rc = -3; goto err3};
    Действие3
    
    ... Основная часть программы ...
    
    Отменяем Действие3
    
    rc = 0;
    goto err1;
    
    err3:
       Отменяем Действие2
    
    err2:
       Отменяем действие1
    
    err1:
      rerurn rc;
    

    这在哪里可以找到?好吧,为了不进入驱动程序,例如:

    启动时,程序应进行以下检查:

    1. 如果第一个要处理的文件不存在,则创建它。如果创建失败,退出
    2. 如果第二个文件不存在 - 切换到标准输入
    3. 建立与 SQL 服务器的连接
    4. 如果失败 - 暂时写入 txt 文件
    5. . . .

    对我来说似乎很清楚,鉴于所示的程序结构,使用goto不仅是可能的,而且是可取的。

    谁不同意这一点-展示如何以不同方式描述这些嵌套条件以及程序变成什么样的噩梦。

    • 4
  2. executex
    2020-08-12T10:29:24Z2020-08-12T10:29:24Z

    当我问了一个类似的问题时,我在 goto 上听取了 Linus 通信的意见

    • 2
  3. insolor
    2020-08-08T13:05:12Z2020-08-08T13:05:12Z

    在某些情况下使用goto可能是合理的。包装goto在一个名称不明确的宏中 - 否 ( shoot )。

    1. goto在现代代码中很少使用(除非您正在编写需要适应有限内存的代码),因此建议明确每个此类转换。
    2. 宏必须像宏一样命名 - 大写。如果它也隐藏在其中,goto那么这个必须写在标题中,例如这样:

      #define IF_FAIL_GOTO(fun, label) if((status = (fun)) != 0) goto (label);
      

      如果宏goto在外观上与常规函数没有区别,并且例如还包含在另一个文件中,那么这会引入不必要的混淆。

      宏应该尖叫它是一个宏,而不是一个函数,并且如果它里面有一些潜在的不安全的东西——比如goto.

    最好不要做这样的事情(提醒你“如果你手里有一把锤子,那么一切都会变成钉子”):

    if (s = (someStruct)calloc(1, sizeof (*s)) == NULL) {
        chk(1);
        // разворачивается в
        // if ((status = 1) != 0) goto Error;
    }
    

    最好明确说明

    if (s = (someStruct)calloc(1, sizeof (*s)) == NULL) {
        status = 1;
        goto Error;
    }
    
    • 1
  4. Stephen Plyaskin
    2020-08-08T17:00:54Z2020-08-08T17:00:54Z

    在这种特殊情况下,不。这里的宏chk是一个脏宏实现assert https://ru.wikipedia.org/wiki/Assert.h 在Linux Kernel或Qt等世界项目中寻找检查值的方法

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5