- 1 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 17:56:53.03 ID:uFDqtnkl.net]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part146 https://mevius.5ch.net/test/read.cgi/tech/1573094136/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.105【環境依存OK】 mevius.5ch.net/test/read.cgi/tech/1556142878/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 ↑え?だってお前、普通ダイナミックリンクするだろ? "ダイナミックリンク"す・れ・ば、ファイルサイズ**増えないです**
- 400 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 19:29:04.71 ID:yQO+Nq01.net]
- まさか do while 構文が論点だと思ってたんかな?
まあ本当はgotoを推す正当性が全くなくてごまかしてるんだろうけれど。 てかgotoと例外安全性はかなり綿密に絡んだ話だろ。誤魔化しすぎだわ。
- 401 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 19:45:18 ID:6oeBvQPN.net]
- >>387
ヒゲ生やした教祖様のために死刑になった信者と同じだなw
- 402 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 19:46:34 ID:fzpRtoDi.net]
- >>380
そのくらいしか思いつかなかったが、>>297はその程度の主張だったんじゃないの? じゃあどういう主張しているとID:PgEzQeWdは解釈していたのかな。そっちが気になる。
- 403 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 19:46:39 ID:6oeBvQPN.net]
- > かなり綿密に絡んだ話だろ
誤魔化しすぎというブーメランが脳天に突き刺さってるぞw
- 404 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 19:54:00 ID:yQO+Nq01.net]
- なるほど。。こりゃ話しても無駄だな。
- 405 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 20:25:44 ID:M/ehGL7C.net]
- gotoと例外安全性がどう絡むのかわからんボスケテ;
- 406 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 21:06:11 ID:fzpRtoDi.net]
- 話しても無駄以前に、結局gotoと例外安全がどう関係するのか一言も出てこなかったな。
- 407 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 21:10:50 ID:CSTVsvTH.net]
- RAIIとgotoは混ぜられないだろ
- 408 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 21:13:01 ID:AinWVopR.net]
- そらgotoでリソース開放ルーチンに飛ぶようなCスタイルのプログラム書くと
例外飛んできたときに死ぬって話でしょ (いくらC++にfinallyが無いからってgotoでリソース開放ルーチンに飛ぶのはダメ) ただし元々の質問には関係ない話なんだがな ところでC++にfinallyが無いのはちょっと良くないよね 今となってはラムダで自作できるようになったからいいけど
- 409 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 21:16:51 ID:fzpRtoDi.net]
- >>398
その「混ぜる」って具体的にはどういうことを言ってるんだろう。
- 410 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 21:24:53 ID:AinWVopR.net]
- 基本的に break や return も生き先の決まった goto なので
余ほど変な使い方をしない限りRAIIと goto を混ぜれないって事はないよなぁ むしろ RAII を使わないで goto でC系のリソース開放をしていた場合にハマるって話では まぁでもこれは do{ if( error ) break; }while(0); //開放処理 return; でも同じことだし、元の質問には関係ないんだが
- 411 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 21:34:33 ID:RfLx+x9F.net]
- まだやってんのか
>>377 それ
- 412 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 21:40:42 ID:RfLx+x9F.net]
- do {
if(...) break; } while (0); よりは { if (...) goto label; } label: の方が良い という
- 413 名前:モ見に賛成
>>303ではないけど [] - [ここ壊れてます]
- 414 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 21:44:50 ID:RfLx+x9F.net]
- まあどっちでも大差ないけど
- 415 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 21:47:25.68 ID:RfLx+x9F.net]
- {
{ if (...) goto label; } } label: これはbreakじゃ無理
- 416 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 21:57:15 ID:RfLx+x9F.net]
- {
switch (...) { case ...: goto label; } } label: これも無理
- 417 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 22:11:05 ID:ByUy1Erg.net]
- while(0)とか意味不明なコードよりgotoでスコープ抜ける方がはるかにシンプルだわな
- 418 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 22:15:20 ID:RfLx+x9F.net]
- 一応 do while(0) の使い方も覚えておいた方が良い
他人のコードを見たりマクロで使ったり する事もあるだろうから
- 419 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 22:17:28 ID:JMAoH3/H.net]
- 普段のdo whileもwhile(0)って書くなど弊害が出るのでやめた方がいい
- 420 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 22:19:27 ID:ByUy1Erg.net]
- ループするつもりもないのにループの構文使うのは悪手だと思う
- 421 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 22:27:26 ID:RfLx+x9F.net]
- >>409
日本語で
- 422 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 22:33:02 ID:fzpRtoDi.net]
- そこはまぁ、ループではあるけれども同時にbreakが使えるブロックでもあるわけで、
実際do-whileなんてほとんどがそういう使い方しかされていないわけだし。 ループできる構文でループしないのはbreakできる構文でbreakを使わないのと 同じようなものかと。
- 423 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 22:36:02 ID:JMAoH3/H.net]
- >>411
do whileしてるのになぜか1回しか実行してないのに気付くのに時間がかかる 習慣で書くのでwhile(0)に気づけない
- 424 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 22:48:25 ID:PgEzQeWd.net]
- こんなささいな違いは個人の好みでいいと思う派
do-while使わない派の言い分もわからなくもないが、 ソースを読む場合gotoだってgoto先を確認しないと意図が理解できないだろ label名を考える必要があるのもちょっとめんどい なのでこんなのどっちでもいい ちなみにrust方式もブロックの先頭にラベル付いてるのは若干違和感覚える
- 425 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 22:50:45 ID:RfLx+x9F.net]
- >>413
誰か解説よろしく!
- 426 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 23:07:09 ID:Wel1D6/w.net]
- どっちのやり方でも構わないけど、リソース◯◯を自動解放するためのブロックだとか意図を示すコメントを付けておいてくれればそれでいい。
- 427 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 23:13:56.14 ID:AinWVopR.net]
- ↑だからその方法だと例外安全が・・・
C++だとリソース開放は RAII か finally かしか幸せになれない
- 428 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 23:17:22.36 ID:RfLx+x9F.net]
- その方法
ってどの方法?
- 429 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 23:23:50.28 ID:Wel1D6/w.net]
- >>417
誤解させたかもしれないから補足すると、どっちのやり方もと言ったのはただのブロックかdo whileかという話のことで、どちらにせよスコープを抜けて破棄されることを想定していた。 解放ルーチンにとばすことは端から考えてなかったよ。
- 430 名前:デフォルトの名無しさん mailto:sage [2020/01/19(日) 23:47:54 ID:L2mlhsAt.net]
- 解放ルーチンにとばすくらいしかgotoの有用な使い方なんてねーだろ。
だからRAII、例外安全の話になってるわけだが もう意地になって意味もわからずgotoにこだわってる馬鹿がいる。
- 431 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 00:05:06 ID:ThUag/92.net]
- finally相当のデストラクタをラムダ式で渡すクラスのインスタンスを作ればいいじゃない、
で済まされてしまいそうだがやはりfinallyはあったほうがいい。
- 432 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 01:01:38.84 ID:KvAer05C.net]
- 「解放ルーチンにとばすくらいしかgotoの有用な使い方なんてねーだろ。」
って思えるぐらい、Cではこの技法が多用された なぜなら真実は逆で 「gotoでとばすぐらいしか開放ルーチンをまとめる方法なんてねーだろ」 だったから多用された A→Bでなくて、実はB→Aだったって話 なんだけど、あまりにもB→Aが多用されたから 数の暴力で逆のA→Bも成り立つと感覚的に思ってしまう だが本当にそうだろうか、gotoに開放ルーチンに飛ばす以外の利用法は無いのだろうか 模索してみよう、というのがスレの流れ スレがその流れになるのは自明で 何故ならC++においては「gotoで開放ルーチン」は例外安全の意味で完全な悪手になったから 初めから勘定に入らないし、考える意味もないし、議論の余地もない 他の利用方法を前提に話すのは当たり前で既定路線
- 433 名前: []
- [ここ壊れてます]
- 434 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 01:58:07 ID:wNCym70P.net]
- スレの流れはvectorの動的な解放手段についてです
- 435 名前:デフォルトの名無しさん [2020/01/20(月) 05:25:12.27 ID:KSbNzMqr.net]
- Javaはgotoを無くした先進設計だからな。
- 436 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 07:11:09 ID:SZK6NMcF.net]
- >>410
ほんこれ メインフレーム時代から「なぜ0を足すんだろう」なんてあったけど そういう謎コード書いて俺スゲーってやる厨二病は痛いよな
- 437 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 07:59:32 ID:hWOi4sNW.net]
- つまりgotoと例外安全がどうとか言っていた人はこんなC時代の技法を念頭に置いていたわけか。
if (fail) goto FINAL; FINAL: 後始末 gotoとRAIIの相性が悪い、混ぜられないという話はまた別なのだろうか。
- 438 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 08:30:41 ID:ItoFGwWk.net]
- >>426が例外安全かどうかとgotoは関係ないんじゃない?
>>273と>>426のコードも関係ない ただ例外安全て言いたかっただけと思う
- 439 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 09:55:56 ID:SZK6NMcF.net]
- >>273
vector<usigned char> huge; //do something huge.clear(); gotoは全く関係ない
- 440 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 10:09:57 ID:rZl1icD3.net]
- >>428
vector自体が確保したメモリが解放される保証がないのでNG とっくに答えは書かれているのだから今からどやるのやめろ
- 441 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 10:14:06 ID:SZK6NMcF.net]
- 保証しないってどこに書いてあったっけ?
- 442 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 10:15:25 ID:JGG/x92o.net]
- >>275
これで解決済みだよなぁ std::vector<...>{}.swap(v)
- 443 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 10:15:47 ID:N9WxJN6X.net]
- >>428
>>291,292辺りを見てこい
- 444 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 10:17:29 ID:N9WxJN6X.net]
- もちろんclear()の仕様も確認しとけ
- 445 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 10:18:17 ID:ThUag/92.net]
- >>292 で実装依存の最適化について言及がある。
あるサイズを超えるまではヒープではなくスタックを使うことで高速実行を期待する実装はあり得ると思う。 vectorの具体例は知らないが、EASTL::basic_stringはそうやってる。
- 446 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 10:40:56 ID:SZK6NMcF.net]
- >>433
だから、どこに書いてあったのかと聞いているんだが
- 447 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 11:04:21 ID:wNCym70P.net]
- >>431の言う空の一時オブジェクトとswapという常套手段で解決するのに質問者のクズは場当たり的などと難癖をつけ、
さらにじゃあnew/deleteしろよというまっとうな意見にバカを言うななどとほざいた結果がこのくだらねえ流れだよ
- 448 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 11:09:12 ID:rZl1icD3.net]
- >>435
c++の規格書は有料だけど持ってんの? ぐぐればstack overflowとかいくらでもひっかかるけど調べた? これは割りと知られた仕様だと思うけどね 実際g++とかでやってみればわかるけどclearしてもcapacity変わんないから
- 449 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 11:14:14 ID:wNCym70P.net]
- 少なくともVC2019はclearでデストラクタが呼ばれてる
- 450 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 11:20:47 ID:N9WxJN6X.net]
- >>438
それはvectorに格納した要素ごとのデストラクタの話であって、それらを格納するためにvector自身が確保した領域が解放されるわけではないだろ
- 451 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 11:29:18.51 ID:SZK6NMcF.net]
- >>437
情報持ってるのに出してくれないのはわかったよ、無理にとは言わん g++の挙動については情報ありがとう
- 452 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 11:53:45 ID:JGG/x92o.net]
- むしろclearで解放せず、capacityが減らないことを保証してほしいよね
capacity減らす手段は用意されているのだから
- 453 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 12:32:03.74 ID:xWGHAxxP.net]
- 結局何を保証して欲しがってるのかさっぱりわからんが
言語仕様はvectorの何やらはもちろん、deleteだってfreeだって、OSにメモリ領域を確実にお返しになる事なんか保証してない事は覚えておこうな
- 454 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 12:33:54.17 ID:RAANiraF.net]
- >>441
> capacity減らす手段は用意されているのだから いや>>432はそれが確実じゃないって話だろ まあそんな実装は
- 455 名前:見たことないけど []
- [ここ壊れてます]
- 456 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 12:52:13 ID:JGG/x92o.net]
- >>443
いや空とswapすれば減るじゃん
- 457 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 13:22:01 ID:hv8WW6TF.net]
- >>444
空とswapは場当たり的に見えて却下と質問者様がおっしゃったからこの論争になったんだぞ
- 458 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 13:22:46 ID:SZK6NMcF.net]
- >>442
OSに返すかどうかの問題じゃねえだろ allocatorが管理するサブプールに還元でもいいわけで
- 459 名前:デフォルトの名無しさん [2020/01/20(月) 14:27:22 ID:0GX6odYx.net]
- 概出鴨試練蛾
do{...}while(0); と {...} の違いって決定的なのは何かって break; を入れられるかどうかだと思うんだけど ループじゃないものに do{...}while(0); を使うのは可笑しいって派の人らは 後者に break; 入れられるようにしておけば良かっただけなんだよな
- 460 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 14:50:16 ID:hv8WW6TF.net]
- ループする気もないのにループ構文を使うのは誤解の元
同様のことは他にもいくつも手段はあるのにループを使う必要がない モダンな書き方だと[&](){...}();
- 461 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 15:02:12 ID:KVDidwnp.net]
- 違うだろ
while使わないよ派はgotoで充分だろ ブロックを抜けるbreakが欲しいのは現状while使うよ派だろ
- 462 名前:デフォルトの名無しさん [2020/01/20(月) 15:15:43 ID:0GX6odYx.net]
- once{};
みたいな構文で良いんじゃね マクロとか書けば
- 463 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 15:21:36 ID:hv8WW6TF.net]
- マクロ()
ベターCとか03で脳みそ止まってんだろうなw
- 464 名前:デフォルトの名無しさん [2020/01/20(月) 15:26:55.87 ID:0GX6odYx.net]
- C++スレだからlambdaでも許されるけどCだと使えないやん?
- 465 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 15:29:38.41 ID:hv8WW6TF.net]
- ほぉ、じゃあお前はCで使える文法のみでC++を書いてんだな
ボケてんのか?
- 466 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 17:52:26.33 ID:SZK6NMcF.net]
- >>447
GOTO文有害説で言われる無条件分岐のスペルがbreakであろうとgotoであろうと同じことだ 同じ意味合いのことを書くために、ループでないものをループという嘘をつくことに俺は反対だ
- 467 名前:デフォルトの名無しさん [2020/01/20(月) 20:28:01.32 ID:KSbNzMqr.net]
- 結局、gotoは使わないほうが良いのですか?
- 468 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 20:51:28.03 ID:SZK6NMcF.net]
- { から } までを1命令と読めるようにするのにgotoは無用と言っているに過ぎない
そのようにまとめようとしていないときやgotoを使っても1命令と読める場合にまで GOTO有害説に囚われ強弁するのは何も分かってないやつのすることということだ
- 469 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 20:56:48.81 ID:rZl1icD3.net]
- つまんないことに拘りすぎ
どっちでもええがな
- 470 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 21:36:31 ID:hWOi4sNW.net]
- >>448
今だとdo-whileでループする方が誤解の元になりそうな。
- 471 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 21:38:12 ID:jzGRQ/VP.net]
- #define BLOCK(stmt) do { stmt; } while(0);
BLOCK( if (error) break; );
- 472 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 21:53:50 ID:IuISEeYy.net]
- do{}while(0)とか初めて見たけど
ダサすぎてそりゃ思いつかねーわwww
- 473 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 21:55:40 ID:dqQuCzGx.net]
- 結局goto有害説に流されないオレカッケーが言いたいだけだろ?
それでもgotoが有効な場面なんかないけどな。禁止にしても問題なんかない。
- 474 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 22:00:17.76 ID:SZK6NMcF.net]
- GOTO有害説に流されるのがオレカッケーと思っているようだな
アホwバカwww 禁止にしたら問題あるからlongjmpやthrowができてきたんだよ
- 475 名前:デフォルトの名無しさん [2020/01/20(月) 22:11:05 ID:KSbNzMqr.net]
- つまり、使わないほうが良いのですね。
なんとなくですがわかりました。
- 476 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 22:12:08 ID:SZK6NMcF.net]
- Javaから帰ってこなくていいからな
永久にバイバイ
- 477 名前:デフォルトの名無しさん mailto:sage [2020/01/20(月) 22:30:44 ID:dqQuCzGx.net]
- >>462
今時、例外の問題も把握してないでlongjumpとかthrowとか言ってんのか。。 馬鹿にもほどがあるわ。 負け確定だから泥仕合にしようってのはわかるがそろそろ引っ込めよ。
- 478 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 05:17:13 ID:AnB6dumh.net]
- >>459
while(0)の後ろにセミコロン付けちゃダメ
- 479 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 07:25:59 ID:XinnYwlJ.net]
- >>465
GOTO有害説に流されているという指摘は否定しないんだな?w
- 480 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 08:47:12 ID:pAPT/+0o.net]
- >>459
定義部 { stmt; } のセミコロンも不要かな。 プリプロセッサを通した変換結果を見て気付いた。 って言うか、関数形式マクロの実引数に 空白とかカッコとかを含めることができるのね。
- 481 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 08:50:21 ID:liyEgHWj.net]
- >>468
確かカンマも使えないはずだし、>>459のマクロは使い勝手は悪く制御構造も隠蔽する有害な使い方だろう。
- 482 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 09:35:24 ID:ecU7KawI.net]
- gotoを使わないことが目的になって
余計分かりにくくしてるアホな例
- 483 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 09:49:43 ID:Hkcle0K4.net]
- goto論争はくだらない
一方でラムダ使ったループ脱出は議論の余地がある これがエレガントに見えるのか パズルに見えるのか 自分の場合どちらかといえば後者 ラムダ自体は多用するけど
- 484 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 11:17:56 ID:Sppu2iw7.net]
- 盲目的にgoto=悪と信じて、かえって読みずらいコード書く奴ってほんとアホだよなあ
- 485 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 13:51:41 ID:XinnYwlJ.net]
- >>470
ほんこれ
- 486 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 13:54:41 ID:XinnYwlJ.net]
- gotoの何が悪いのかわかってないやつをもう少しいたぶってやろうと思ってたけど
途中で可哀想になってきて答え書いてやってるのになあ。。。
- 487 名前:デフォルトの名無しさん [2020/01/21(火) 18:52:44 ID:xueGtX5x.net]
- >>460
do { } while(0) は自分は見たことがある。 忘れてしまったが、確か、#define マクロの定義部分で使われていて、目的は、 マクロ全体が一つの分の用に実行されて欲しいことであったようだった。 #define マクロ名() do {\ ・・・\ ・・・\ } while(0) のような感じだったと思う。 これなしで裸で書くより安全になる場合があった気がする。
- 488 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 18:57:29 ID:fxsKQzaN.net]
- if (...) マクロ();
else ...
- 489 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 18:57:46 ID:xueGtX5x.net]
- >>475
忘れてしまったが、おぼろげながら何か以下の様なことに関連していたような記憶がある。 C/C++では、if 文の直後は {}がなくても書くことが出来てしまう。 それで、 if (条件式) マクロ関数名(); のように書いた場合、マクロの定義部を単なる {} で書くより安全な場合があったような 気がする。 忘れた。
- 490 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 19:00:56 ID:xueGtX5x.net]
- >>476
あ、その場合だね、多分。 #define aaa() {・・・} と定義してしまった場合、 if (...) aaa(); else ... と書くと、 if (...) {}; else ... と展開されてしまい、else の部分がエラーになってしまう。ところが、 #define aaa() do {・・・} while(0) と定義していると、 if (...) do {} while(0); else ... と定義されて、正しく動作する。
- 491 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 19:03:11 ID:xueGtX5x.net]
- https://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for
↑に書いてあった。
- 492 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 19:11:44 ID:jtyzl32v.net]
- それは11年前のネタだからそうなってるけど現代C++ならラムダ式で書くべき内容
- 493 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 19:19:17 ID:fxsKQzaN.net]
- マクロでしか書けない物もあるんだよ
- 494 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 19:19:18 ID:jXO8TLK9.net]
- 大昔の工芸品みたいやな
- 495 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 19:24:51 ID:fxsKQzaN.net]
- ていうかなぜラムダ式?
考える順は以下じゃない? 関数 インライン関数 テンプレート関数 マクロ
- 496 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 19:35:47 ID:jtyzl32v.net]
- >>483
そこで回答されている #define FOO(x) do { foo(x); bar(x); } while (0) は #define FOO(x) [&] { foo(x); bar(x); } () と簡潔に書ける そのQAの内容は今のC++におけるdo-while(0)の有用性を示す内容ではない
- 497 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 20:01:36.85 ID:fxsKQzaN.net]
- ああ、そういうことか
do while に対するメリットがないと 互換性から do while を選ぶことになりそう
- 498 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 20:17:22 ID:V9u70PsA.net]
- ラムダ式はc++11からか
使えない環境は結構あるんだろうな 近付きたくない
- 499 名前:デフォルトの名無しさん mailto:sage [2020/01/21(火) 20:20:59 ID:m86EWX9f.net]
- >>484
最適化前提にしないと代替とは言えない
- 500 名前:ヒ []
- [ここ壊れてます]
|

|