0

我一直在为一个开源项目 BRL-CAD 编写代码,这是一个已经开发了 30 多年的受人尊敬的项目。在修改文件时,我注意到一些奇怪的逻辑,特别是在出现错误时使用 goto 作为退出函数的一种方式。我读过的每一本书都宣扬这样一个事实,即每个 goto 都有更好的替代品,但在这种情况下,我同意 goto 可能是最佳选择的来源。鉴于:

tables.c 是一个大文件,包含程序中用于排序和获取数据表的 3 个函数。下面是检查错误并在遇到错误时点击 goto 的代码片段,整个文件: http: //pastebin.com/u4jnNbLu

if ((tabptr=fopen(argv[1], "w+")) == NULL) { //takes place 300-400 lines before the end goto is declared
    bu_vls_printf(gedp->ged_result_str, "%s:  Can't open %s\n", argv[0], argv[1]);
    status = GED_ERROR;
    goto end;}

转到结束:

end: //frees memory used in function and returns the status(which became an error above)
    bu_vls_free(&cmd);
    bu_vls_free(&tmp_vls);
    bu_ptbl_free(&cur_path);

    return status;

使用 goto 作为函数中止可以?我以前从未想过这样的 goto,但对我来说,这似乎比将代码放在一堆令人困惑的大括号中更合乎逻辑,而 while's / if's / else's 会不断地插入代码以检查是否有问题。

4

2 回答 2

3

这是纯 C 中的常见构造(以及一些使用返回值而不是错误异常的 C++),并且在 IMO 中是完全可以接受的。这将所有清理工作保持在一个地方(或根据函数的结构尽可能靠近一个地方),并且比使用嵌套 ifs 的错综复杂的网络来验证一切是否正常工作更容易阅读和维护.

于 2012-12-04T23:44:33.160 回答
2

goto 名声不好,但这并不意味着不应该使用它。多年来,我一直在 C 语言中使用 goto 来处理特定的错误情况。

您可以在 Linux 内核的编码风格中找到 goto 也用于这些情况:http ://www.kernel.org/doc/Documentation/CodingStyle

你可以在这里找到关于在 C 中使用 goto 的讨论:GOTO 仍然被认为是有害的吗?

于 2012-12-04T23:44:22.713 回答