続・謎の warning: array subscript has type 'char'
どもです。
重い体を動かして〜。
プリプロセッサにマクロを展開してもらいましたよ〜。
そしたら分かった気がしますよ〜。
一応前回のソース。
#include <stdio.h> #include <ctype.h> int main(void) { char buf[128] = { '\0' }; /* test_isalpha.c:8: warning: array subscript has type 'char' */ if (isalpha(buf[0])) { printf("isalpha\n"); } /* no warning issued */ int c = buf[0]; if (isalpha(c)) { printf("isalpha\n"); } return 0; }
プリプロセッサに通した結果の一部。
int main(void) { char buf[128] = { '\0' }; if ((((__ctype_ptr__+sizeof(""[buf[0]]))[(int)(buf[0])])&(01|02))) { printf("isalpha\n"); } int c = buf[0]; if ((((__ctype_ptr__+sizeof(""[c]))[(int)(c)])&(01|02))) { printf("isalpha\n"); } return 0; }
あやしいですね〜。実にあやしいですね〜。
「sizeof(""[buf[0]])」というところ。
おっと 「sizeof(""[buf[0]])」と書いても, スーパープレ記法だっけ? つかわないと表示がおかしくなる。 はてなのバグか? それとも html では ]] とか書くと怒られる?
重要なのは,sizeof の引数(といっていいのだろうか?)で,
これはなにをしているかというと,何をしてるの?
char の型のサイズを調べてる? わからん。
"" に添え字でアクセスしている。
こういうのが可能なのは知っている。
char c = "Hello, World!"[0]; // c => 'H' とか。
要するに,buf[0] の中身で,"" にアクセスしているから,
添え字に char を使ってるぞーという警告がでているというわけか。
今回たまたま buf[0] は,'\0' で初期化しているから,
int にキャストしてゼロになり,いいものの?,
仮に buf[0] に a とか入っていると危ないんじゃないのか?
segv ったりとかしない?
あー,でも後ろの方でも何かやっているからわからん。
でも,後ろの方の添え字でのアクセスする際には,(int)(buf[0)) と
int にキャストしているよなぁ。
とまぁ,原因がなんとなくわかったのですが,
対処法はわからず。一回 int な変数に入れるしかないのかな?
もしくは,自分で判定するとか?
知っている人いたら教えて下さいまし。