我一直在为一个开源项目 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 会不断地插入代码以检查是否有问题。