1. ホーム
  2. c

[解決済み] C言語におけるエラー管理のためのgotoの有効な使用法?

2022-12-13 17:58:23

質問

この質問は、実際には 興味深い議論 の結果です。基本的には以下のコードに集約されます。

int foo(int bar)
{
    int return_value = 0;
    if (!do_something( bar )) {
        goto error_1;
    }
    if (!init_stuff( bar )) {
        goto error_2;
    }
    if (!prepare_stuff( bar )) {
        goto error_3;
    }
    return_value = do_the_thing( bar );
error_3:
    cleanup_3();
error_2:
    cleanup_2();
error_1:
    cleanup_1();
    return return_value;
}

の使い方は goto の使用は、すべての可能性の中で最もクリーンで効率的なコードをもたらす、最善の方法であるように思われます。Steve McConnell の引用 コードの完成 :

goto は、次のようなルーチンで有用です。 リソースを確保し、そのリソースに対して リソースを割り当て、そのリソースに対して操作を実行し その後、リソースの割り当てを解除するルーチンで有用です。gotoを使うと を使用すると、1つのセクションでクリーンアップすることができます。 ができます。gotoを使えば を忘れてしまう可能性が低くなります。 リソースの割り当てを忘れる可能性が低くなります。 エラーを検出するたびにリソースを解放するのを忘れる可能性が低くなります。

このアプローチのもう一つのサポートは Linux デバイス ドライバー の本の中で このセクション .

どうでしょうか?このケースは goto の有効な使い方でしょうか?より複雑な、あるいはより効率の悪いコードを生成する、他の方法が良いでしょうか? goto ?

どのように解決するのですか?

FWIF、あなたが質問の例であげたエラー処理イディオムは、これまでの回答であげられたどの代替案よりも読みやすく、理解しやすいと思います。 一方 goto は一般的には悪いアイデアですが、シンプルで統一された方法で行われた場合には、エラー処理に役立つことがあります。 このような状況では、たとえ goto であっても、十分に定義された、多かれ少なかれ構造化された方法で使用されています。