[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/22 04:06 / Filesize : 243 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

gotoを恐れず使う兵共がfinallyや多重breakを語るスレ



1 名前:デフォルトの名無しさん [2005/08/11(木) 11:18:15 ]
前スレ pc8.2ch.net/test/read.cgi/tech/1021364372/

652 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:31:14 ]
C言語の仕様としては>>645みたいなのはどうなってるのか、詳しい人教えてよ

653 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:35:43 ]
少なくとも変数の場所は確保されてるべき。
(最適化でレジスタに割り当てられると見た目じゃわかんないけど)

goto foo;
{
 int bar = 44;
foo:
 printf("%d\n", bar);
}

で 44 が表示されるべきだったかどうだったか調べてみる...

654 名前:デフォルトの名無しさん [2008/02/16(土) 12:49:41 ]
647はfinallyの処理系依存実装を見たことないのかと

655 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:40:44 ]
>>652
同じ関数内のループに飛び込んでるだけだろ

656 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:39:42 ]
>>652
普通の実装ならブロックローカルな変数も関数呼び出した時点で
スタックに領域確保するんじゃねーの?

657 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:51:47 ]
>>651
gotoは「局所的な制御」にしか使わないから。
そして「構造」は「常に全体が対象」だ。

燃料としては不足だ。

658 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:03:24 ]
>>657
> gotoは「局所的な制御」にしか使わないから。
> そして「構造」は「常に全体が対象」だ。

もちろん>>651はそれが前提で書いていると思うが?
全体を見ずに局所だけを見ているからgotoを使いたがる
というのが>>651の趣旨だと思うが。

659 名前:657 mailto:sage [2008/02/16(土) 17:02:23 ]
>>658 んじゃ。
全体を見て局所も見ていればgotoを使いたがらない。
という命題は正しいのかい?

660 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 17:15:16 ]
>>659
それは言語の設計思想によるんじゃないかな。
goto前提な言語なら自然とgoto使うことになるし、
goto原則使わないのが前提な言語を使っていて、
かつ、全体の構造を考える習慣がついていれば、
gotoが必要っぽい状況になったら自然と全体の
構造を疑う方向に目が向くと思うよ。




661 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 17:57:34 ]
gotoを使いたくないだけの理由で構造を変えるのは、本末転倒にならないように気をつけないとな。

662 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:21:23 ]
gotoが必要になるのは全体の構造がおかしい兆候なのではと疑うのと、
gotoを使わないだけの理由で全体の構造を変えることとでは
天と地ほどの差があるけどな。

663 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:07:13 ]
紙一重だろw
構造を見直したい程gotoが気になるなら、まず
設計に対する姿勢から疑わないと。


664 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:09:49 ]
かわいそうな>>663には見直すことと疑うことの違いがわからないらしい。

665 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:13:47 ]
初心者向けの指標としては有りだろう。

666 名前:デフォルトの名無しさん [2008/02/16(土) 19:14:42 ]
>>664 無駄だって、相手はgotoを使いたいという結論が先にある人なんだから。

667 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:16:31 ]
>>664は見直したら必ず変更しなくちゃ行けないと思ってるらしい。

668 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:17:27 ]
わかりやすい自作自演をみた。

669 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:32:20 ]
>>665
> 初心者向けの指標としては有りだろう。

gotoを使いたがるのは初心者が多いという意味で賛成だ。

670 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:34:40 ]
>>667
そんな君の発言「紙一重」wwwwwwwwwwwww



671 名前:デフォルトの名無しさん [2008/02/16(土) 19:39:57 ]
疑うことと構造を変えることを紙一重と言っちゃってるからねえ
かなり苦しいんじゃないの?

672 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:46:22 ]
燃料に引火しちゃったようで、ナイーブなgoto厨さんwwwwwwwwwwwwwww

673 名前:665 mailto:sage [2008/02/16(土) 19:56:31 ]
>>669
そういう意味での賛成は遠慮させていただく。

「どうしてもgotoが必要な場面になったら、構造を見直してみよう」
のようなアドバイスは、初心者向けにはいいかもしれない。
終端条件やデータ構造を見直したら、もっといい方法がみつかるかもしれない。
けれど、そのgotoが適切だと思うなら、見直す必要もない。
gotoはあくまでもきっかけとして、である。

クロージャとかlambdaが欲しいな、と思いながらgotoを書く事もある。
goto(と飛び先のラベル)の場所が適切なら、問題ない。


674 名前:665 mailto:sage [2008/02/16(土) 19:57:15 ]
自演醜ス・・・

675 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:58:19 ]
なんでgotoについて語るのに構造のことまで持ち出すんだかが
全然わかんない。論争根源の論文の
www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF
と同様なネガティヴキャンペーンにしか見えないぞ。

676 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:00:06 ]
問題ないと言ってgoto乱発する馬鹿は
他人のgotoまみれコードを保守した経験がない
ビギナーさん

677 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:06:45 ]
>>676 ぐちならマ板行でな。

678 名前:デフォルトの名無しさん [2008/02/16(土) 20:12:36 ]
自演認定したがる奴が自演常習者

679 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:15:42 ]
↓次はsageで同意、と。

680 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:15:59 ]
まさか「gotoを使う人間は使いたいから使う」などと思っている人はいないよね?
gotoつかう人は「goto使ったほうが良い」と判断しているから使うんだけど。
gotoを使わずに簡潔に書けるならば、好き好んで使ったりはしないよ。



681 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:16:45 ]
ちぃ、はずしたか。

682 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:20:09 ]
>>680
> gotoつかう人は「goto使ったほうが良い」と判断しているから使うんだけど。

その判断が狭すぎるという話じゃなかったのか?

683 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:35:45 ]
goto厨は視野狭窄ということがプログラミングだけでなく議論においてもそうだということが証明されましたな

684 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:43:02 ]
存在しない相手に対して勝利宣言か・・・

685 名前:680 mailto:sage [2008/02/16(土) 20:48:32 ]
>>680
ああそうさ。必要も無いのにgoto使うというのはたしかに判断が狭いということだ。
これは開発担当のスキルの不足を反映しているのに過ぎない。
この問題の根源は開発担当に対するスキル管理の不足/欠如だよ。
悪いのはgotoやgotoを使ったプログラムやgoto使った人間では無いことを確認したいわけよ。

だけどgotoの使用判断は開発担当の職掌さ。
どのようなロジックにおいてもgotoを使わないほうが優れているという証明が出来ない限り、
goto禁止ルール自体は不当なルールだと言いたいね。

686 名前:680 mailto:sage [2008/02/16(土) 20:49:45 ]
>>682
だた。失礼

687 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:51:54 ]
プログラミング言語を作るときには、
徹底的にgotoを使わなくて済むようにしてほしいね。
多重breakをできるようにしたり、try-catch-finallyにデストラクタを用意したり。

688 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:53:44 ]
それはJavaだ

689 名前:デフォルトの名無しさん [2008/02/16(土) 20:54:14 ]
美しいgoto文だって書けるのに。
汚いgoto文を見ただけで、「goto禁止」は、まりにも短絡的すぎ。
for〜continue〜break文にせよ、do〜while文にせよ、if文にせよ、try〜catchにせよ、
ネストしまくりでワケワカラン汚いコードを書くヤツは、そこらへんにウヨウヨいる。
いったいどうやったら、構造化言語をここまで汚く書けるのか、もう信じられんほど。
なのになぜ、goto「だけ」がこれほどまでに差別されなければならないのか。
・・・ま、そこらへを書くと、またキチガイが湧くんでホドホドにしとくが。
美しく書けばgotoは害では無い。これは確か。

690 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:56:25 ]
>>685
とりあえず、モチツケ。
無条件goto禁止、については合理的な理由の説明は無かったはずだ。



691 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:56:46 ]
それはわかるけど、現実は汚いgotoを書く奴が9割9分。
goto禁止したところで、そのうち9割くらいはフラグ付きwhileとか結局スパゲティを書く気がするけど。

692 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:02:41 ]
>>689
gotoには「最後の手段」の側面もあるからね。
gotoとラベルの置き場所の自由さっぷりは両刃の剣なわけで。


693 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:04:39 ]
で、自由奔放にgotoを使いまくってるコードを最後にみたのは何時なんだ?
なんかもう脳内事例で語ってるようにしか見えないんだが。

694 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:06:34 ]
例えば、Linux kernel ではエラー処理に飛ぶためのgotoをいっぱい使ってるけど
全然読みづらくない。こういうgotoは全く問題にならないし、
Cで綺麗にエラー処理を書こうとしたらああならざるを得ないと思うけどな。

>>691
人格攻撃は生産的じゃない。もっと実になる議論をしようや。

695 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:08:16 ]
g○ヒo きたないgoto

696 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:14:12 ]
肯定派
多重ループからの抜け出し、エラー処理、リソースの開放で定型的に使うならありだろ。
gotoを避けるというのを関数分割のタイミングにするのは馬鹿らしいし。
大体goto使ったが為のスパゲッティコードなんて大昔の非構造化BASIC以来見たことないぞ。

否定派
goto駄目。絶対。goto使う奴はコードが汚く低能!

697 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:24:22 ]
>>696を読んでいるとgoto厨の視野の狭さがよくわかるという罠www

698 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:26:41 ]
Linux kernelのソースクオリティを高いなんていう香具師の言うことは、
その程度の扱いを受けて当然だな。

699 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:28:11 ]
構造を見直してもっといい設計にすれば使わずにすむgotoがあるという話と
gotoを自由奔放に使いまくるという話の間にはずいぶんと開きがあることに
>>693が気付く時は来るのだろうか。。。(遠い目

700 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:34:55 ]
そもそもgoto絶対禁止なんて主張してる香具師、このスレにはいないと思うが(藁



701 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:35:50 ]
%sのソースクオリティを高いなんていう香具師の言うことは、
その程度の扱いを受けて当然だな。

702 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:37:07 ]
絶対禁止はないよな。
ただ現存する用法すべてに盲目的にケチつける奴がいるだけでw

703 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:39:47 ]
>>702 そんな香具師いるか?
つーか、そもそも現存する用法すべてのリスト、このスレに挙がってるのか?

704 名前:デフォルトの名無しさん [2008/02/16(土) 21:46:24 ]
setjump, longjump だって綺麗に書きさえすればいい。

705 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:48:28 ]
poor man's continuationか。
まあ使えばいいんじゃない?

706 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:50:22 ]
goto厨は、なんかもう脳内事例で語ってるようにしか見えないんだが。

707 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:53:43 ]
>>698
まぁまともな会社で、まともな品質のプログラムがかけるプログラマでも
Linuxのソースクオリティで書けるプログラマなんて少ないけどな。

708 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:54:10 ]
>>704
ナイ、ナイ

709 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:56:40 ]
時代は変わったな。
Linuxカーネルの可読性の低さはBSDハッカーの格好の標的だったのに。
今じゃLinuxカーネルが高品質と言われるようになったか。。。(遠い目

710 名前:デフォルトの名無しさん [2008/02/16(土) 21:59:19 ]
具体例には例外なく難癖つけるくせに
そう指摘されるといや、そんなことないよとごまかす嫌goto厨。
もう年相応の趣味を持てずただリアルでの孤独を癒す為に宗教論争スレに常駐してるだけみたいだね。



711 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:00:11 ]
>>708
Cのマクロで例外処理を実装するような使い方はきれいなsetjmpの使い方だと思う。

712 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:00:19 ]
>>710 goto厨は、なんかもう脳内事例で語ってるようにしか見えないんだが。

713 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:01:45 ]
>>705
なるほど、poor man's continuationね。確かにそうかも。

714 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:05:48 ]
まぁ継続なんて、使わんよ。

715 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:07:12 ]
>>711
Cで例外つっても、単にジャンプすればいいだけじゃなくて、それ以外にも
C++でいうデストラクタの処理とか色々必要になるわけで。setjmpはつかわないわ。

716 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:07:50 ]
Linuxカーネルでのgotoの使い方の話なのに、Linuxカーネルのコードの
クオリティの高さに話を逸らしてるお馬鹿さんがいますね


717 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:26:19 ]
Linuxカーネルの可読性の低さの話なのに
無関係だということにしたい人がいますね

718 名前:デフォルトの名無しさん [2008/02/16(土) 22:27:27 ]
>>715
どうせマクロなんだからfinally実装しちゃえばいいじゃない。
NSAutoreleasePoolみたいに「暇なとき始末してね」と予約しておいて、
早めに開放したい資源(ファイルディスクリプタとか)を利用した後や、
イベントループのように定期的に戻ってくる場所で開放する手もある。

719 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:33:20 ]
>>718
そんな難しいことできるわけないだろ
お前実装してみろよ

720 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:33:49 ]
だいたいgotoダメって行ってるやつは、
3年目くらいで、やっとできるとまわりから認められ、
ちょっと自信が付いてきたやつ。
後輩に教える機会も増えて、得意になって、よく分からんくせに
中途半端な知識でものを語ってるんだろ。
gotoの話なんて、もう十何年も繰り返されてるのに。



721 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:35:04 ]
もう十何年も繰り返されていてもまだgotoにしがみついてる厨房がいるねえ

722 名前:デフォルトの名無しさん [2008/02/16(土) 22:37:11 ]
3年目の先輩に頭ごなしに教えられて反発してるビギナー君の登場です

723 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:40:58 ]
これまでの傾向

-嫌goto厨の主張はいつも抽象論の域をでない
-抽象論でgotoを否定するだけで、「おえらいさんが言ってただろ?だから従え」
 という傲慢な主張しかない
-goto肯定派の具体的な例に関しては、「構造的に考えれば、とか、構造を再度
 検討しなおせば」とか、これまた抽象論でしか返さない。

要するに、嫌goto厨の主張なぞその辺の学者のタワゴトにしかすぎず、
なんら実務面の利点を示しているわけではない。

724 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:41:48 ]
スパゲッティコードは絶滅したと思っている人必見。>>469
こんなコードを書く香具師がgotoを使ったらどんな恐しいことになることか。

725 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:43:00 ]
>>723
goto厨の提示したソース、どうにも実務的なのはないのだが。
あるというのならアンカーで示してくれ。

726 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:46:13 ]
これまでの傾向

-goto厨の主張はいつも抽象論の域をでない
-抽象論でgotoを肯定するだけで、「おえらいさんが言ってただろ?だから従え」
 という傲慢な主張しかない
-goto否定派の具体的な例に関しては、「実用的ではない、とか、
gotoでも害がなければ」とか、これまた抽象論でしか返さない。

要するに、goto厨の主張なぞその辺のワナビーのタワゴトにしかすぎず、
なんら実務面の利点を示しているわけではない。

727 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:48:49 ]
>>723にも>>726にも禿同
ようするに目糞鼻糞

728 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:50:36 ]
GOTO 1

729 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:59:31 ]
goto厨ってなんだよ。
goto使ったらダメとにかくダメって言ういかれぽんちに、
んなわけねーだろって言ってるだけだろ。

730 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:02:24 ]
>>729
せいかい^^



731 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:31:19 ]
ごとーさんがお怒りですよ

732 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:35:00 ]
>>731
だれ?

733 名前:GOTO mailto:sage [2008/02/16(土) 23:56:15 ]


734 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:18:43 ]
見やすかったらどっちでもいいよ

735 名前:デフォルトの名無しさん [2008/02/17(日) 03:32:45 ]
>>719 でけた。TRY〜END_TRYの中からreturn出来ないけど。
typedef struct ex_handler_rec_ ex_handler_rec_;
struct ex_handler_rec_ {
    ex_handler_rec_ *volatile prev_;
    jmp_buf jbuf_;
    const char *volatile ex_type_;
    void *volatile ex_data_;
};
ex_handler_rec_ *volatile current_handler_ = NULL;

#define EX_ABBREV(x) x
#define TRY { \
ex_handler_rec_ EX_ABBREV(ex_handler_); \
int EX_ABBREV(need_rethrow_) = 0; \
if (0) BREAK_TRY; /* mandate finally clause */ \
EX_ABBREV(ex_handler_).prev_ = current_handler_; \
current_handler_ = &EX_ABBREV(ex_handler_); \
if (setjmp(EX_ABBREV(ex_handler_).jbuf_) == 0) {

#define BREAK_TRY goto EX_ABBREV(break_entry_)
#define RETHROW goto EX_ABBREV(rethrow_entry_)

#define CATCH(extype) \
} else if (!extype || !strcmp(extype, EX_ABBREV(ex_handler_).ex_type_)) { \
   void *EX_ABBREV(ex_data) = EX_ABBREV(ex_handler_).ex_data_;
#define CATCH_ALL \
} else if (1) { \
   void *EX_ABBREV(ex_data) = EX_ABBREV(ex_handler_).ex_data_;

736 名前:デフォルトの名無しさん [2008/02/17(日) 03:33:37 ]
#define FINALLY \
} else { \
   if (0) goto EX_ABBREV(rethrow_entry_); /* supress warning */ \
EX_ABBREV(rethrow_entry_): \
   EX_ABBREV(need_rethrow_) = 1; \
} \
EX_ABBREV(break_entry_):; \
if (current_handler_ == &EX_ABBREV(ex_handler_)) /* no exception */ \
   current_handler_ = EX_ABBREV(ex_handler_).prev_; \
{

#define END_TRY } \
if (EX_ABBREV(need_rethrow_)) \
   throw_exception(EX_ABBREV(ex_handler_).ex_type_, EX_ABBREV(ex_handler_).ex_data_); \
    }

void throw_exception(const char *ex_type, void *ex_data) {
    ex_handler_rec_ *handler = current_handler_;
    current_handler_ = handler->prev_;
    handler->ex_type_ = ex_type;
    handler->ex_data_ = ex_data;
    printf("throw_exception %s\n", ex_type);
    longjmp(handler->jbuf_, 1);
}

737 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 03:40:13 ]
こういう風に使う。EX_ABBREVマクロを再定義することでTRYのネストができる。
TRY {
#undef EX_ABBREV
#define EX_ABBREV(x) a_##x
    TRY {
        if (cond)
            BREAK_TRY;
        throw_exception("hoge", cond2 ? "abc" : NULL);
    } CATCH("fuga") {
        if (a_ex_data) /* throw_exceptionの第二引数はEX_ABBREV(ex_data)に入る */
            printf("%s fuga\n", (char *)a_ex_data);
        else
            RETHROW;
    } FINALLY {
        printf("inner finally\n");
    } END_TRY;
#undef EX_ABBREV
#define EX_ABBREV(x) x
} CATCH("fuga") {
    printf("fuga %s\n", ex_data);
} FINALLY {
    printf("outer finally\n");
} END_TRY;

738 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 03:46:42 ]
きめぇぇぇぇ

739 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 04:21:39 ]
具体例なんて、普及しているオープンソースのコードを引っ張ってきて
grep goto すりゃ見つかるだろ。


740 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 04:25:13 ]
return 時に実行してくれない finallyに何の意味がある?
あと、for,whileなどのループ内では、このマクロは使えないね。
(BREAK_TRY のあと、ループ脱出条件を再度判定してbreak文を実行しなきゃならない:二度手間)



741 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 04:47:21 ]
>>725
2chは行数制限があるから実用されているコードを貼るのは無理だね。
アンカーではなくポインタは示すので、あとは自分で調べて。
# apache が実務的なコードでないという奴はいないよな?

$ grep -r -n goto httpd-2.2.8/server
httpd-2.2.8/server/vhost.c:717: goto bad;
httpd-2.2.8/server/vhost.c:747: goto bad;
httpd-2.2.8/server/vhost.c:754: goto bad;
httpd-2.2.8/server/vhost.c:904: goto found;
httpd-2.2.8/server/vhost.c:916: goto found;
httpd-2.2.8/server/mpm/netware/mpm_netware.c:421: goto got_listener;
httpd-2.2.8/server/mpm/winnt/child.c:954: goto shutdown;
httpd-2.2.8/server/mpm/winnt/mpm_winnt.c:871: goto die_now;
httpd-2.2.8/server/mpm/experimental/event/event.c:1140: goto worker_pop;
httpd-2.2.8/server/mpm/worker/worker.c:882: goto worker_pop;
httpd-2.2.8/server/mpm/prefork/prefork.c:614: goto got_fd;
httpd-2.2.8/server/mpm/beos/beos.c:560: goto got_a_black_spot;
httpd-2.2.8/server/mpm/beos/beos.c:562: goto got_fd;
httpd-2.2.8/server/util_xml.c:58: goto read_error;
httpd-2.2.8/server/util_xml.c:79: goto read_error;
httpd-2.2.8/server/util_xml.c:88: goto read_error;
httpd-2.2.8/server/util_xml.c:93: goto parser_error;


742 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 06:54:58 ]
>>741
おいおい、今さら提示しても遅いって。>>723
> -goto肯定派の具体的な例に関しては、「構造的に考えれば、とか、構造を再度
とか
> なんら実務面の利点を示しているわけではない。
とか書いた時点で、じゃあgotoの実用的かつ正しい使い方というのは
どんな具体例があったんだよって話なんだから。

743 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 06:55:01 ]
goto肯定派曰く「何も考えずにgotoを使う奴などいない」
goto否定派曰く「全てのgotoが駄目だという奴などいない」

であれば、肯定派否定派など互いにレッテルを貼っているだけで不毛な言い合いだな。
「どういう場合にgotoを使うのか、使わないのか」という具体的な議論にこそ意味があると思うが。


744 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 06:59:38 ]
>>742
linuxカーネルの話は723よりも前に出ている。

ま、くだらない貶しあいには興味がないので具体例で。
vhost.cの最初の3つはこういう構造。

static void fix_hostname(request_rec *r) {
 ...
 if (rv != APR_SUCCESS || scope_id) { goto bad; }
 ...
 if (r->hostname[0] != '[') {
  for (dst = host; *dst; dst++) {
   if (apr_islower(*dst)) { ... }
   else if (*dst == '.') { ...; goto bad; }
   else ...
  }
 }
 ...
 return;
bad:
 ...
 return;
}


745 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:03:07 ]
自分は>>744のgotoの使い方は特に問題がないと思う。見やすい。

gotoを使わずにより良いコードを書ける人は代案をよろしく。
「744のように端折られると詳細がわからないから書けない」という言い訳はなしな。

「本物」のコードへのポインタは>>741にある。必要なら本物を見てくれ。


746 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:05:30 ]
それから、一つだけ。

抽象的な言い合いの間は散々吠えておいて、
こういう流れにされると何もいえなくなる人へ。

「お前はgotoを使うな」

747 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:22:04 ]
vhost.cの下2つ(L904, L916)はこの関数。

static void check_hostalias(request_rec *r) {
 処理
 for (ループ条件) {
  処理 // この部分に、条件を満たしたらcontinueというコードがある
  if (判定条件) goto found;
  処理 // この部分に、条件を満たしたらcontinueというコードがある
  if (判定条件) goto found;
 }
 return;
found:
 r->server = s; // この一文のみ
}

これはごく単純なgotoの例。多重ループでも何でもないが、使わない人フラグを立ててbreak?
r->server=s; return;を二箇所に書くという書き方も、二箇所程度ならありかもね。

748 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:24:39 ]
>>744
bad:
...
return;
な部分をマクロにしちゃえばgotoなんて使う必要ないんじゃ?

749 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:27:08 ]
mpm_netware.cでの使われ方

for (ループ条件) {
処理
do {
処理
if (条件) goto got_listener;
処理
} while (ループ条件);
continue;
got_listener:
処理
}


750 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:32:07 ]
>>749
goto got_listenerが一箇所なら
if (条件) {処理; break;}で済む問題だな。
複数箇所なら処理をstatic関数にすればいい。
そもそも「処理」ってくくれるぐらいまとまってるんだろ?



751 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:33:27 ]
ちなみにこうやって具体的なコード片で議論しても
全体の構造うんぬんの話の検証にはならない。
というか、むしろ局所的な制御しか考えてないと
goto慎重派に言われても仕方ないことになるが。

752 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 07:37:26 ]
このパターンは条件がどんどん後付けされるのでは?
過去何度かあったろ。いいかげん気付け。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<243KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef