C++相談室 part160

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2022/04/15(金) 08:39:32.42ID:WMzvufu2
前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1645239402/
2022/04/19(火) 04:23:27.96ID:M6r3Rc52
nanだのinfだの>>81だのをグチャグチャとチェックしたがる奴は無能
最初からそういうのが発生しないように計算するべき
83デフォルトの名無しさん
垢版 |
2022/04/19(火) 06:18:55.90ID:0L/+n52g
ゼロ除算とかね
2022/04/19(火) 14:44:51.44ID:0UVfIqO/
libc遅いだの愚痴りながら低レイヤーのコード書いてる時が正直一番楽しい
85デフォルトの名無しさん
垢版 |
2022/04/19(火) 14:50:47.69ID:0L/+n52g
人によるけどね
俺もマシン寄りのところが好き
2022/04/19(火) 23:13:42.68ID:fQcWHs5l
MC++Dが20年前に発売されたってすげーな
アンドレイって天才だろ
2022/04/20(水) 19:24:03.82ID:q+GeEjNV
移住して快適な掲示板

NEXT2ch
3ch
45ch
明和水産
  
などへ
88デフォルトの名無しさん
垢版 |
2022/04/20(水) 20:22:28.34ID:Cwlkz3kl
二度と帰ってくるなよ
2022/04/20(水) 21:01:40.29ID:q+GeEjNV
居座るなら二度と文句言うなよ
2022/04/20(水) 22:15:36.38ID:4qIYThBV
>>89
早速帰ってきてて草
2022/04/21(木) 08:12:05.34ID:lT6JRJu8
今どき戻り値intでエラーコードとか使うなよCの書き方じゃねぇかとか思ってた
だけどC++17のvariantでエラーコード返したり、optional使ってエラー表現してるコードを見てちょっと感心した
しかしとはいえこういうやり方と例外ぶん投げるやり方ってどっちがいいんだろう?ググっても割りと論争あってよくわからんかった
2022/04/21(木) 08:41:18.15ID:uyGzUV2B
>>91
制御フローを変更する必要がある場合は例外、それ以外(エラーもフローの一部の時)はoptionalでいいんじゃない?
例外は性能ペナルティーあるし、あんまり使うものじゃないと思うわ。

例えばメモリ確保失敗とかはプログラムの続行が難しいから、安全に終了するメモリ異常時の終了フローに移行できるよう例外を使うといいかと。
2022/04/21(木) 09:00:35.99ID:9qc6sZDy
一部で悪名高い例外はマルチスレッドでこそ重宝すると思うんだが
2022/04/21(木) 09:09:09.66ID:3fppYdMF
例外はやばいエラーと普通のエラーを分けて欲しいわ
後者はあんまり遠くへ飛ばんでほしい
95デフォルトの名無しさん
垢版 |
2022/04/21(木) 09:18:47.88ID:TFObbQ1T
異常系は例外、準正常系はエラー
という方針がええな
2022/04/21(木) 09:50:55.00ID:uYH/mfeQ
ここだけの話ちゃんとした例外処理書かれたコード読んだ事がない
2022/04/21(木) 11:09:48.62ID:Ex423fK8
例外って、移行の処理を全く出来なくね
try{
a();
b();
c();
}
catch(...)
{
}

a()がコケても、何がしかの条件をかえてb()いこうを実行したいときなんて不便
try tryなんてやりだしたら、各関数の戻り値をifで判断しているのと同じだし
98デフォルトの名無しさん
垢版 |
2022/04/21(木) 11:15:18.89ID:Nb12Wot+
言い出したらキリないからだろ
a()がコケたあとC()から再開とか無数にあるから
try {
a();
b();
c();
}
catch(std::exception& e)
{
if(dynamic_cast<f*>(&e))
{
if(dynamic_cast<g*>(&e))
{
b();
}
c();
}
}
2022/04/21(木) 11:17:35.59ID:9+GFB0OX
例外処理でどこまでカバーするかってのは初期には色々と検討されてる。
でも結局のところ「あきらめて終わる」「条件を変えてやり直しする」が圧倒的多数で
その他は言語機能としてサポートする必要ないレベルのレアケースだと判断された。

>>97
そういう場合は諦めて try をネストしたり連鎖したりしてなんとかしろってことだ。
少なくとも言語仕様をより複雑にするほどではない。
2022/04/21(木) 11:31:04.81ID:3fppYdMF
>>97
まあ分岐じゃなくて脱出を目的にするのが筋で、そういう制御はしない
王道ルートを一本バシッと決めないと
2022/04/21(木) 11:51:54.97ID:Ex423fK8
>>100
それなら
if(!a()) goto ERROR;
でよくね
2022/04/21(木) 11:56:00.06ID:Ex423fK8
>>96
つboost
2022/04/21(木) 11:58:33.22ID:cKs9hG6Z
>>98
やらねえよ
a()が例外出したらcatchしてboolなりint返してa()からやり直しだ
2022/04/21(木) 12:08:19.70ID:1fqzAB87
例外そのものが結構重たい処理だから
発生頻度が高いものでは使いたくない
2022/04/21(木) 12:50:04.39ID:sNS+foI5
GoやRustなど最近のプログラミング言語は例外がないね
代わりに多値やoptional/variant相当でエラーを返す
2022/04/21(木) 15:46:22.58ID:Ex423fK8
>>104
例外機構自体は重くないよ
発生時にcatchするまでが規定できないからRTOSなどでは使いにくいってだけ

その手のプログラムをしている人なんてそう多くないなから実際は気にする必要はない
2022/04/21(木) 15:56:00.29ID:QxqybM0K
基本的にtry catchは使わない
それを守るだけで改善できる
108デフォルトの名無しさん
垢版 |
2022/04/21(木) 17:14:16.48ID:Nb12Wot+
まあね、正直<setjmp.h>でええやんと思うことはある
しかし標準ライブラリがtry catch前提で作られているので
それを使う限りは仕方がない

longjmpの第2引数をポインタに写像すれば
そこからdynamic_castで場合分けもできるんだが
いざ自前でやるとなると標準ルールが欲しくなる
2022/04/21(木) 17:26:35.88ID:3fppYdMF
longjmpも大概だわ
2022/04/21(木) 17:30:09.55ID:9+GFB0OX
単に大域脱出するだけなら setjmp で良いが、
例外を投げたら途中にあるオブジェクトのデストラクタを呼んでちゃんと後始末してくれるってのが良いところなわけだろ。
そんで同等のことを setjmp でやろうとしたら実行コストが大きいってのは sjlj で凝りてるだろ。

大域脱出を使わないってのを徹底するならそれはそれでアリだと思うんだが、
半端に例外っぽいものを作るくらいなら素直に例外を使ったほうがいいわ……。
2022/04/21(木) 17:43:25.69ID:Dvrv0zRB
dynamic_castなんてゴミより例外使うやろ
2022/04/21(木) 17:43:55.51ID:vSoU0DUY
例外を使わずに普通に代数的データ型でエラーを返せば良い
そのためにoptionalやvariantがある
2022/04/21(木) 17:44:34.43ID:Hotp0qqb
例外が嫌われる原因は、はるか遠くのスナイパーに即死させられるからだよ
ある前提ならどこにスナイパーがいてもいいように書く必要があって、そのためには地下の穴を掘り進めて絶対地上に出ないなどの策が必要になる
2022/04/21(木) 17:53:06.42ID:uYH/mfeQ
いや単純に例外がシステムコールだからだろ
動的メモリ確保然りmutexロック然り
意味不明な例え話は必要ない
2022/04/21(木) 18:07:39.87ID:3fppYdMF
pythonの例外は割と好きだわ
c++でチームでやってるときは使わんほうがまあ無難
2022/04/21(木) 18:38:56.67ID:Hotp0qqb
>>114
君が経験不足なだけ
2022/04/21(木) 18:40:53.59ID:/MI4h9k1
え、C++の例外がシステムコールってどういうこと?なんか関係あるの?
2022/04/21(木) 18:45:27.70ID:9qc6sZDy
キャッチオール規制
2022/04/21(木) 18:53:33.55ID:Ex423fK8
>>117
びっくりするくらいC++の知識ない奴がいるよな
たんにネットとか過去の案件からコピペしただけで
そのコードがどういう意味なのかも分からないなんてバカが打ちの会社にいるわ
2022/04/21(木) 18:59:53.52ID:uYH/mfeQ
煽れば1から100まで全部説明して貰えると思ってるんだろう
2022/04/21(木) 19:06:54.50ID:3fppYdMF
シグナル的な話かね
122デフォルトの名無しさん
垢版 |
2022/04/21(木) 19:07:51.99ID:5bVBNknH
例外のどこがシステムコールなんだよw
笑わせんなw
2022/04/21(木) 19:29:12.31ID:Hotp0qqb
経験不足もココまで来ると哀れだな
CPUの例外とかシグナルをC++の例外としてあげることはあるけど、throwやtry/catchにシステムコールは関係ないよ
またsetjmp, longjmpをシステムコールと思ったのかもしれないけど、これらはCの標準関数だよ
2022/04/21(木) 19:38:44.45ID:dzuJ6upO
>>123
>throwやtry/catchにシステムコールは関係ない
sjlj だけが例外の実装ではないのでは?win32api なら SEH とか
2022/04/21(木) 19:40:56.19ID:XLa0Reo3
生娘が多いスレですね
2022/04/21(木) 19:49:07.82ID:ylgd21Wg
GoやRustのように例外のないプログラミング言語もあるように
例外は各言語内の単なる制御の一手法にすぎない
そこにシステムコールというOSの呼び出しは出てこない
2022/04/21(木) 19:53:37.32ID:3fppYdMF
実装としてそれを期待することはあるんじゃねえかなあ
2022/04/21(木) 20:23:53.47ID:dzuJ6upO
>>126
>>124
2022/04/21(木) 21:03:10.33ID:c/plR3QG
少なくともbsd系やlinux系などで例外にシステムコールは一切出てこないな
だから例外とシステムコールは無関係であると断言できる

もしシステムコールがからむ環境があったとしてもそれはその環境独自の問題
C++やその他の言語の例外とシステムコールは無関係
130デフォルトの名無しさん
垢版 |
2022/04/21(木) 21:10:18.22ID:5bVBNknH
>>128
ISO標準の例外処理はどれかわかるよね?
2022/04/21(木) 21:19:47.06ID:oUL8Hy4A
>>124
SEHとC++例外は別物だしMSはC++ならC++例外使えって言ってる
https://docs.microsoft.com/ja-jp/cpp/cpp/structured-exception-handling-c-cpp
SEHは基本的にハードエラーを補足するために使うものだぞ
2022/04/21(木) 23:52:24.64ID:UxG5J1QB
SEHは別にハードエラーに限ったもんじゃないが。
基本的にカーネル側で発生する例外一般であって、DLL周りで発生するのはよく見かけると思う。
2022/04/22(金) 00:45:41.32ID:a+ReXgZI
例外の話しがなんで、SEHの話しになってんだ?

例外って知らないのか?
うちの会社にもいるわ、デバッガに制御が移っただけなのに
例外が〜なんて言ってるバカ
2022/04/22(金) 01:10:17.53ID:+Hg7lfxg
>>133
それは、例外の実装が sjlj しかないという馬鹿がしつこいからだよ
2022/04/22(金) 01:20:20.42ID:fqEw0n+a
C++の例外try throw catchの仕様は
システムコールと一切無関係
2022/04/22(金) 01:27:09.01ID:OAazuPnp
>>135
そんなに必死になるのはなんか理由があんの?
2022/04/22(金) 01:42:30.48ID:BvFOL7Y8
>>134
それ以外に何かあるの?
他では不可能
2022/04/22(金) 01:53:53.59ID:BJPJNuGw
SEHの訳語が構造化例外ハンドリングだから、例外の一種と言えるはずだ。
2022/04/22(金) 02:07:46.66ID:CMih2sNI
C++にはSEHとやら言うものは存在しないし関係ないんじゃね?
2022/04/22(金) 02:36:51.42ID:BJPJNuGw
いや、ゼロ除算やヌルポインタアクセスなどで素朴なC/C++でもSEHが発生することはあり得る。
2022/04/22(金) 02:40:55.00ID:coLCpeOs
お前ら全員、り地域指定な
2022/04/22(金) 02:51:22.19ID:BJPJNuGw
dangerous yofukashi
2022/04/22(金) 05:33:50.18ID:h+Fap4CC
>>132
カーネルで発生してるわけじゃないだろ
よく知らないのに絡んでくるなよ...

>>138,140
>>91から始まる話にSEHは関係ない
2022/04/22(金) 06:10:41.99ID:8e+rCGWk
>>140
C++にはSEHというものはありませんし発生することもありません
勉強して出直してきてください
それまでこのスレに書き込み禁止
145デフォルトの名無しさん
垢版 |
2022/04/22(金) 06:18:31.32ID:Y1J+20vl
VC6の頃はゼロ除算をcatch(...)で捕獲できたな
2022/04/22(金) 06:40:52.54ID:/ALeatGN
ゼロ除算はSIGFPEが発生するから捕捉したかったらsignalでハンドリング関数を指定
例外は全く関係ない
147デフォルトの名無しさん
垢版 |
2022/04/22(金) 06:45:33.62ID:Y1J+20vl
だから昔話だってば
あり得んことが目の前で起きたから
よく憶えてるんだよ
2022/04/22(金) 06:50:31.85ID:HuED6Bkz
どっかの会社の独自拡張だろ
C++の話じゃないな
2022/04/22(金) 06:52:40.42ID:e55dh4X+
蟻人間ってちょいちょい見かけるけどこういうでたらめなやつだったのね
2022/04/22(金) 07:02:53.87ID:kPq/rze/
>>137
>>124
win32api なら SEH, 最近は gcc も SEH に置き換わっているときく
2022/04/22(金) 07:03:35.95ID:kPq/rze/
>>139
それをいうなら sjlj だって同じ
今の流れは例外のインプリメントの話題なのでは?
2022/04/22(金) 07:04:28.01ID:kPq/rze/
>>144
実装方法の話でしょ?sjlj だけ認めて SEH は認めないなんて矛盾してませんか?
2022/04/22(金) 07:21:51.39ID:poIoQlGh
どこかの会社の独自拡張の話をC++の機能だと思い込んでC++スレに持ち込むのはやめましょう
以下の話はここでOKです
setjmp/longjmpはC/C++の標準機能です
signalもC/C++の標準機能です
try/throw/catchはC++の標準構文です
154デフォルトの名無しさん
垢版 |
2022/04/22(金) 07:37:43.45ID:Y1J+20vl
ISO/IEC14882の範疇から一歩たりとも出るなってのは無理だろ
2022/04/22(金) 07:45:58.57ID:Bpn1KdM3
>>154
特定の企業によるその環境下での独自な拡張について
そうであることを認識できず区別できずにC++の機能だと勘違いしてここに書き込むのは完全にアウト
2022/04/22(金) 07:48:49.99ID:zZkpCShI
>>151
setjmpとlongjmpはC標準として参照してるから存在するぞ
157デフォルトの名無しさん
垢版 |
2022/04/22(金) 07:50:39.14ID:Y1J+20vl
書き込んだ本人に悪意がないのにアウトっておまえさんが何かペナルティを課すのか?
普通にそれは違うよと教えてやるのは全然スレ違いじゃないだろ
2022/04/22(金) 07:59:20.08ID:0Q7NQ1lp
発端はこれだよな

>>114
> いや単純に例外がシステムコールだからだろ

違うと皆から指摘されてもここまで延々と続けていて悪質
2022/04/22(金) 08:29:32.01ID:OAazuPnp
>>158
そいつがずっと書いてるとおもってんの?
2022/04/22(金) 08:34:38.92ID:OmhkX7bc
>>159
別人だとしても同罪
C++と関係ない話をずっと続けている悪人
161デフォルトの名無しさん
垢版 |
2022/04/22(金) 08:37:18.75ID:Y1J+20vl
何かさ、C++の実用場面を1つも知らない世間知らずが
自分のためのシェルターを要求してるみたいだな

そんなの当人含め誰の何の役にも立たんのに
2022/04/22(金) 08:48:05.34ID:u/m8ttCW
分かりやすい例え
もしAppleによる独自拡張の話をC++の機能だと思い込んでここで延々と話を続ける人たちがいたら
迷惑だからApple方面のスレでやれ!と怒られるだろ
それと同じことが今ここで起きている
2022/04/22(金) 08:48:50.34ID:OAazuPnp
>>160
罪の意識で死にたくなったってことですか?
止めないですよ
2022/04/22(金) 08:50:00.21ID:OAazuPnp
>>162
親も早死にしたんですか?
2022/04/22(金) 08:59:58.70ID:FOSKJcjg
>>141
ここはり地域w
2022/04/22(金) 09:14:12.23ID:oMnlDCaF
自治厨が延々暴れ続けるのも迷惑なんだが
2022/04/22(金) 09:20:29.23ID:LDoEF43J
SEHってJavaなど色んな言語でMicrosoftが勝手に拡張してるやつだぜ
だからC++の話ではないとまともな人ならわかるはず
168デフォルトの名無しさん
垢版 |
2022/04/22(金) 09:56:02.95ID:kaZmiYOz
SEHってC言語で実装されているWin32API周辺開発でも例外機構を使えるようにしたものじゃないの?
例外機構が備わってるC++でSEHの出番はないと思うけど
169デフォルトの名無しさん
垢版 |
2022/04/22(金) 10:46:47.56ID:Y1J+20vl
一言注意するのは構わんが
同調しないやつがいるからって
言い負かすまでしつこくするのは迷惑だぞ
2022/04/22(金) 11:21:59.53ID:HAxRxWew
マイクロソフトの解説

構造化例外処理 (SEH) は、ハードウェア障害などの特定の例外コードの状況を適切に処理するための、C に対する Microsoft の拡張機能です。 Windows と Microsoft C++ は SEH をサポートしていますが、ISO 標準の c++ 例外処理を使用することをお勧めします。 これにより、コードの移植性と柔軟性が向上します。 ただし、既存のコードまたは特定の種類のプログラムを維持するために、SEH を使用する必要がある場合もあります。

Microsoft 固有:
2022/04/22(金) 11:33:57.93ID:OAazuPnp
>>170
親は何歳で死んだん?
2022/04/22(金) 11:35:01.23ID:oMnlDCaF
自分は正義の味方のつもりでも
周りにとって迷惑なだけなのは
まるでスッパマンだな
2022/04/22(金) 11:38:47.55ID:udIu01iV
勘違いしていたと謝罪すりゃ済むのに逆切れで死の書き込みを繰り返してるやつヤバいな
2022/04/22(金) 11:54:33.77ID:OAazuPnp
>>173
相手が一人という前提なのは、数で勝ってると思い込みたいから?
死んだ親もそういう人だったん?
2022/04/22(金) 12:01:35.35ID:P/jSiaWo
>>174
どこにも一人と書かれていないし前提もないようにみえるけど幻覚が見えているの?
2022/04/22(金) 12:23:58.18ID:BJPJNuGw
大阪弁も日本語だろ。
Win32 C++コンパイラではゼロ除算で浮動小数点例外が発生することも知らんとは。
まさかVirtual C++がC++コンパイラではないと言いたいほさ。
2022/04/22(金) 12:25:23.61ID:oJU3aoBf
Virtual C++?
2022/04/22(金) 12:31:17.16ID:BJPJNuGw
Visual C++ね。
2022/04/22(金) 12:33:13.97ID:6yZvfKA9
ゼロかどうか直前に調べてゼロならthrowすることでどんなコンパイラでもゼロ除算の時に例外を投げることが可能です
つまりコンパイラの問題ではありません
そして誰でもそうすることが出来るというだけでありC++の仕様や機能ではありません
2022/04/22(金) 12:38:40.45ID:wri6W8iQ
>>176

構造化例外処理 (SEH) は……C に対する Microsoft の拡張機能です。

C++でも標準でも無いな。
いつまでスレ違い粘着しているんだよ。
2022/04/22(金) 12:38:40.63ID:BJPJNuGw
ゼロ除算の処理はマシン依存。
だから、コンパイラは構造化例外を発生させてもいい。
これも標準C++に含まれる。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況