0

私はオープン ソース プロジェクト 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 のネストにコードを配置するよりも、私にはより論理的に思えます。

4

2 に答える 2

3

これは純粋な C (およびエラーの例外の代わりに戻り値を使用する一部の C++) で一般的な構造であり、IMO では完全に受け入れられます。これにより、すべてのクリーンアップが 1 か所 (または関数の構造に基づいて可能な限り 1 か所に近い場所) に保持され、すべてが正しく機能したことを検証するために、ネストされた if の絡み合った Web よりもはるかに読みやすく、維持しやすくなります。 .

于 2012-12-04T23:44:33.160 に答える
2

評判が悪いが、それはそれを使用すべきではないという意味ではありません。特定のエラー ケースを処理するために、C で goto を何年も使用してきました。

Linuxカーネルのコーディングスタイルで、これらのケースにもgotoが使用されていることがわかります:http://www.kernel.org/doc/Documentation/CodingStyle

C での goto の使用に関する議論は、次の場所にあります

于 2012-12-04T23:44:22.713 に答える