- 1 名前:デフォルトの名無しさん [2005/08/11(木) 11:18:15 ]
- 前スレ pc8.2ch.net/test/read.cgi/tech/1021364372/
- 641 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:46:19 ]
- むしろ開発者の一存で、boostが使えることが少ない
- 642 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:49:36 ]
- デストラクタでログ取ると、ローカル変数のトレースを取れないんだよね。
- 643 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:23:45 ]
- >>642
トレースしたいローカル変数より後にロギング用の変数を宣言するのはダメ? リリース版でログを取るのでなければ、boost::formatとか使わなくても printfベースの実装で十分だと思うし。
- 644 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:41:48 ]
- >>643
トレースの対象がオブジェクト(またはその属性)の場合は?
- 645 名前:デフォルトの名無しさん [2008/02/15(金) 20:45:03 ]
- 昔、
goto aho: ... { int baka; ... aho: ...(bakaを使う) } ってやったら、bakaを確保せずにいきなりahoに飛ぶコードを吐かれた(MS-Cかな?)。 それ以来gotoは完全封印
- 646 名前:638 mailto:sage [2008/02/15(金) 21:24:01 ]
- >>639
fall through だけじゃダメだと思う。 「case は switch 直下に無くても文法的に正しい」 って仕様が含まれている必要がある。 C は case 〜 をそれ以外の単なるラベルと同列に扱うという仕様になっているから、 「>>529 のように switch 直下ではなく while の中に case を書いても正しく動く」 ということが後になって発見(正確には”確認”)されたんじゃないかと。 ところで、ふと java の仕様見たら www.y-adagio.com/public/standards/tr_javalang/14.doc.htm#35518 思いっきり >>529 が書いてあるし。
- 647 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:35:04 ]
- >>640
え、C++だったの? 627でfinallyって言っているからC++はないと思っていたんだけど。
- 648 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:52:40 ]
- >>644
テンプレートで超がんがる。 DebugLogger d("%d %d\n", &var, std::make_pair(obj, &A::func));
- 649 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 10:08:37 ]
- >>645
そんな入れ子の外から飛び込むのは、どんな言語の場合でも 自殺行為に近いだろ。 入れ子の外で定義が終わってれば 別だがね。
- 650 名前:デフォルトの名無しさん [2008/02/16(土) 12:03:37 ]
- Doで始まるループなんだけど最初の1回だけ途中までは飛ばしたいときってあるよね。
多分そういうときに使ってるんだと思うけど、 普通はなんとかする。
- 651 名前:デフォルトの名無しさん [2008/02/16(土) 12:29:19 ]
- goto使いたがる厨房は局所的な制御ばかり見て全体的な構造の見直しをしない、と、燃料注入w
- 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;
|

|