在函数内部使用goto作为退出的手段

时间:2012-12-04 23:40:28

标签: c function goto

我一直在为开源项目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作为函数是否中止 ok ?我以前从来没有考虑过像这样的goto,但是对我来说似乎比将代码放在一个混乱的括号嵌套中更合乎逻辑,而在代码中不断地插入代码以检查是否有错误。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

您可以在Linux内核的编码样式中找到goto也用于这些案例:http://www.kernel.org/doc/Documentation/CodingStyle

您可以在此处找到有关在C中使用goto的讨论:GOTO still considered harmful?