C 在函数中使用goto作为退出的手段

C 在函数中使用goto作为退出的手段,c,function,goto,C,Function,Goto,我一直在为一个开源项目BRL-CAD编写代码,这是一个值得尊敬的开发项目,至今已有30多年。在修改一个文件时,我注意到一些奇怪的逻辑,特别是当出现错误时使用goto作为退出函数的手段。我读过的每一本书都宣扬这样一个事实,即每一个后藤都有一个更好的替代品,但在这种情况下,我同意消息来源的说法,后藤是最好的选择。鉴于: tables.c是一个大文件,其中包含程序中用于排序和获取数据表的3个函数。下面是一段代码,用于检查错误并在遇到错误时点击转到,整个文件: 转到结束: end: //frees me

我一直在为一个开源项目BRL-CAD编写代码,这是一个值得尊敬的开发项目,至今已有30多年。在修改一个文件时,我注意到一些奇怪的逻辑,特别是当出现错误时使用goto作为退出函数的手段。我读过的每一本书都宣扬这样一个事实,即每一个后藤都有一个更好的替代品,但在这种情况下,我同意消息来源的说法,后藤是最好的选择。鉴于:

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

转到结束:

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不断插入代码以检查是否有错误。

goto的名声不好,但这并不意味着它不应该被使用。在C语言中,我已经使用goto处理特定的错误案例很多年了

您可以在Linux内核的编码风格中发现,goto也用于以下情况:


您可以在这里找到关于goto在C中使用的讨论:

goto的名声不好,但这并不意味着不应该使用它。在C语言中,我已经使用goto处理特定的错误案例很多年了

您可以在Linux内核的编码风格中发现,goto也用于以下情况:


这里可以找到关于Goto在C中的用法的讨论:

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

这是纯C中的常见构造(还有一些C++使用返回值而不是异常来进行错误),并且IMO是完全可以接受的。这将保持所有清理在一个地方(或者根据函数的结构尽可能接近一个地方)。而且,比一个嵌套的IFS网络来验证所有的工作都是正确的,要比C++的C++更容易阅读和维护。在C++中,C++是一种非常标准的跳转清理代码的方法,如你在POST、C或C++中看到的那样。每种语言的最佳实践都是不同的……在一点上, Goto < /Cord>在C++中几乎没有用(我不反对),而在C中,这是一种跳转清理代码的非常标准的方法,正如你在文章中看到的那样。
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;