続・謎の 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 な変数に入れるしかないのかな?
もしくは,自分で判定するとか?
知っている人いたら教えて下さいまし。