我一直在为开源项目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,但是对我来说似乎比将代码放在一个混乱的括号嵌套中更合乎逻辑,而在代码中不断地插入代码以检查是否有错误。
答案 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?