Re: デバッグ文(可変引数マクロ)C99 仕様
阪本@nifty です。
"Shinji KONO" <kono@ie.u-ryukyu.ac.jp> wrote in message
news:3988646news.pl@insigna.ie.u-ryukyu.ac.jp...
> そのサブルーチンでの前提条件を書けですね。早めにバグを見つける
> 手段として使うみたい。
私が得た印象では(もうかなり昔に読んだキリなのであやふやですが)、
処理が継続できないような間違った入力なら落とし、入力として想定
されてはいるが正しくはない場合にエラーとして返す…でした。
> サブルーチンに前提条件があるとすれば、それを明示しろってのは
> 理解できます。しかし、それをチェックすると遅くなるってのは、
> 僕は、なんか変だと思う。コンパイラや実行時の工夫で、それは避
> けられるはず。
>
> オブジェクト指向とかコードの再利用、あるいは、プラグインなどが
> 導入された現在では、
>
> 処理を実行する前提条件は、必ず、チェックする
>
> ってのが必須だと思う。なので、assert ってのは現状にあってな
> いと思います。
必ずチェックするは、同感ですが、
# オブジェクト指向でもエラーの返し方は…特に C++ か…
# 何の exception 投げるのかきちんと書いてくれてないと
# catch できなくて assert と変わらない気がしなくもない…。
# そう言えば、Java だと配列の範囲 check しなくても、exception で
# すむから安全だとかいう意見を itpro に見掛けた気がします。
# きちんと上で catch しているんだと信じたいですけど…
> この手のコードは残るべきなのね。そして、
>
> エラーチェックで失敗したときに、あと引き受ける
>
> ことが必須だと思う。もちろん、絶対に復帰できないエラーっての
> があるのは、そうだと思うんだけど、オブジェクトとかメモリプー
> ルとかプロセスとか使うことによって結構避けられると思うんだけ
> ど。
は、完全に実現しようとすると全て virtual machine の上で走らせて
最悪は virtual machine の再起動が必要になりませんか?
# virtual machine の使うデータは全て本体の database に登録して
# いつでも rollback できるようにするのかな。
> というわけで、僕の立場は、
>
> エラー処理をしないことが前提のassertは、製品化しないような
> プログラム(あるいは、マイクロソフトの売ったら勝ち、バグは
> 知らん方針)が前提であり、時代遅れであって、使ってはいけない
> ものだ。
>
> ってなもんです。
>
> たぶん、数値計算とかだと「デバッグ時」と「計算時」がわかれている
> から assert とか有効なのも知れないな。
エラー処理をしない、Microsoft がそう考えているかは知らないのですが、
「エラーを返しても処理できないのなら、エラーを返しても仕方ない」とも
Writing Solid Code には書かれていましたね。
# 「処理してくれないなら、abort してやる」みたいな話だったと記憶しています。
> Writing Sold Code には、もう一つ、
>
> サブルーチンのエラー通知と値の返却を共用しない (つまりEOF==1やNaNみた
いな
> のを使わない)
>
> ってものがあるんだけど、これもエラーを上位に通知しないことを
> 前提に書いていると思う。エラーを通知する手段としてreturn value
> を使うのは僕は有効だと思う。実際、EOF は便利だし。
これは返り値を「エラーを返す手段として使うなら、エラーかそうでないか
以外の値を含めない」「返り値に値を入れるなら、エラーは別経路で返す」と
言っているんじゃないかと思います。 > Writing Solid Code
あの本は library 作成者がその利用者である programmer を信じないという
本だと感じました。
だから、自分の設計する library が時と場合によって、
- エラーを返り値に含めたり、含めなかったり、
- エラーの判別方法が違ったり、
とかいった混乱を招くようなことをすると、programmerは必ずひっかかって
しまう、と。
それがゆえかは知らないのですが、Microsofot の COM は全て返り値の中
にはエラーかそうでないかの情報しか入らないです。
# そして、FAILED か SUCCEEDED かのマクロで失敗/成功の判別ができま
# す。
--
---
Takashi SAKAMOTO (PXG01715@nifty.ne.jp)
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735