[解決済み] 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
であっても、十分に定義された、多かれ少なかれ構造化された方法で使用されています。
関連
-
error: '.' トークンの前にunqualified-idを指定する必要があります。
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
[解決済み] PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init ( &mutex, param )
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] C言語で関数をパラメータとして渡すにはどうすればよいですか?
-
[解決済み] PHPで有用なエラーメッセージを得るにはどうしたらよいですか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】 `throw new Error` と `throw someObject` の違いは何ですか?
-
[解決済み】Javaにgoto文はあるのか?
-
[解決済み】ループや関数をサポートする言語で「goto」の正当な使用例はあるのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
VSCodeでCプログラムを書くとエラーになる:ソースファイル "stdio.h" を開くことができない
-
C/C++の再定義
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?