私はオープン ソース プロジェクト 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 を関数 abort として使用しても問題ありませんか? 私は前にそのような goto について考えたことはありませんでしたが、何かが間違っているかどうかをチェックするために常にコードに突っ込んでいる紛らわしい中括弧と while の / if の / else のネストにコードを配置するよりも、私にはより論理的に思えます。