[Mew-dist 14767] Re: bin.tar.gz
Shigeya Suzuki
shigeya at example.com
2000年 10月 26日 (木) 11:06:16 JST
>>>>> "onoe" == Atsushi Onoe <onoe at example.com> writes:
一カ所訂正
> なお、isdigit については、平気なのではないかと思いますが、僕は
> unsigned char だったらイヤなことが起きそうだという過去の経験から、
~~~~~~~~~~~~~ signed char の誤り
> ついつい & 0xff して渡したりします。isdigit の側が知ってれば問題起らな
> いですが。(単なるパラノ)
onoe> char が signed char か unsigned char かは処理系依存です。
onoe> つまり、int を引数に要求する関数に char を渡すのは処理系によって
onoe> 受け取る値が変わることになるので、warning 出すのは親切に思えます。
onoe> 実際、isdigit() に MSB の立った signed char (つまり EOF 以外の負の値)を
onoe> 渡してはいけません。portable なプログラムでは
onoe> char *p;
onoe> if (isdigit((unsigned char)*p))
onoe> ...
onoe> の様にキャストするのが普通です。(int) や (unsigned int)でキャストしても
onoe> 無意味なので注意。
肝心なこと書くの忘れた(笑) 私が & 0xff してたのは、このためです。
# 実際の例で言うと、Lattice C と CIC (Optimizing C) は、unsigned / signed
# で、差がありました。学生時代に、痛い目にあいました。
onoe> なお、C では文字を扱う関数では、char でなく int を使います。これは主に
onoe> EOF が char で表現できないためです。
onoe> 文字 := 0..255 | EOF
onoe> もちろん文字列は char [] であって、int [] ではありませんが。
ちなみに、ディスカッションの元のエラーをみなおしたら、実装的に、エラー
から見て、テーブルドリブンかつ signed char のようなので、MSB 立ってる
奴を渡すと、実際に問題起き得ます。だから、warning は正当でしょう。
ただし、BSDIとFreeBSD の実装を見てみたら、実質的には、MSB たってるのも、
EOF 渡しても平気なようには作ってあります。 しかし、? : 式で括ってある
ので、コンパイラは怒るのだな。
onoe> 引数、戻り値に int より小さい(short, char など)を使う場合の処理
onoe> はK&R と ANSI で違った様な気もします。これも上記の理由の一つかも
onoe> 知れません。
onoe> # さて、どのくらい正しいかな:-p
これ、見たような記憶あるけど、確証ないなぁ。
shigeya
Mew-dist メーリングリストの案内