if (実行結果==err) { 後始末; return err; } if (実行結果==err) { 後始末; return err; } 後始末; return success; }
step2 後始末は一箇所にまとめたい
result = subfunc(&変数1,&変数2,…); 変数1, 変数2,…に対して後始末; return result; } int subfunc(型1 *変数1, 型2 *変数2, …) { if (実行結果1==err) return err; if (実行結果2==err) return err; return success; }
step3 変数の使用と後始末の場所が離れてるのがイヤ
switch (0) { default: result=err; if (実行結果1==err) break; if (実行結果2==err) break; if (実行結果3==err) break; … result=success; } 後始末 return result; } /*switch の代わりに、他のコメントでマクロ定義に出ているような do {…}while(0) も可。でも、ループじゃないことが明確なのでswitchの方が好みかな。どっちにしろちょいとトリッキーですが。*/
step4 break って、結局gotoだよなと気づき、goto禁止主義と撤回
result = err; if (実行結果1==err) goto finally; if (実行結果2==err) goto finally; if (実行結果3==err) goto finally; result = success; finally: 後始末 return result; }
結局、gotoを使う方がシンプルで読みやすいって結論になる。
使って言いgotoと使ったらダメなgotoをコーディングルールで縛るのが難しいのが欠点かなぁ。
#step3のテクニックで、try~catchっぽくするマクロを見た覚えがあるんですが、今探したら見つけられなかった… 確か、do while(0) と switch とで二重にくるんで、break →switch脱出、continue→do while 脱出と、二種類の似非gotoを使い分けてた覚えがある。
gotoを久しぶりに見た (スコア:0)
Cで組まなくなって長いけどgotoを使ったコードは久しぶりに見た
OSのコードだからオーバヘッドを減らすためかもしれないけど
違和感ありまくり
コメント読んでもヘンテコマクロの話ばかりで皆さん違和感ないのかな
いつもこんな感じのコードを書いてるんでしょうかね
Re:gotoを久しぶりに見た (スコア:1)
「構造化プログラミングではgoto禁止」の原理主義にはまり込む流れ
step1 とりあえずgoto禁止
step2 後始末は一箇所にまとめたい
step3 変数の使用と後始末の場所が離れてるのがイヤ
step4 break って、結局gotoだよなと気づき、goto禁止主義と撤回
結局、gotoを使う方がシンプルで読みやすいって結論になる。
使って言いgotoと使ったらダメなgotoをコーディングルールで縛るのが難しいのが欠点かなぁ。
#step3のテクニックで、try~catchっぽくするマクロを見た覚えがあるんですが、今探したら見つけられなかった…
確か、do while(0) と switch とで二重にくるんで、break →switch脱出、continue→do while 脱出と、二種類の似非gotoを使い分けてた覚えがある。
Re:gotoを久しぶりに見た (スコア:2)
こんな感じですかね。
#switch (0) { default: xxxx } って構文初めて見た
Re:gotoを久しぶりに見た (スコア:2)
あらダメだ、THROWマクロにbreakは使えない
Re:gotoを久しぶりに見た (スコア:2)
Re: (スコア:0)
goto一律禁止に反対する連中がなんで中括弧は一律つけろとか言うのか理解に苦しむ。
ようは「場合による」「適材適所」←これこそ便利すぎて禁止ワードにしたい