From: Katsuyuki Komatsu Date: 1999-05-17T15:28:05+09:00 Subject: [ruby-dev:6859] signed/unsigned char warning 小松です。 AIXのgccのデフォルトのcharの型がunsignedのようなので、 以下のようなwarningが出てしまいます。 ccもcharデフォルトはunsigned。 gcc -O2 -I. -I. -I/usr/local/include -c y.tab.c parse.y: In function `read_escape': parse.y:1886: warning: comparison is always 0 due to limited range of data type parse.y: In function `yylex': parse.y:3132: warning: comparison is always 1 due to limited range of data type …… gcc -O2 -I. -I. -I/usr/local/include -c string.c string.c: In function `rb_str_succ': string.c:715: warning: comparison is always 0 due to limited range of data type string.c: In function `tr_trans': string.c:1718: warning: comparison is always 0 due to limited range of data type 下の例のようにcharがunsignedだと、char c = -1; の後の(c == -1)はfalseです。 オプションを指定して、 env CFLAGS='-O2 -fsigned-char' ./configure \\ --with-readline-dir=/usr/local とか、 env CC=cc CFLAGS='-O -qchars=signed -qmaxmem=8192' ./configure \ --with-readline-dir=/usr/local とかすれば済みますが、 parse.y, string.cの-1を(char)-1にした方が安全かな? / / / % echo `uname -s; oslevel` AIX 4.1.3.0 % cat char.c #include int main() { char c = -1; if (c == -1) printf("c == -1\n"); else printf("c != -1\n"); if (c == (char)-1) printf("c == (char)-1\n"); else printf("c != (char)-1\n"); return 0; } % cc char.c; ./a.out c != -1 c == (char)-1 % cc -qchars=unsigned char.c; ./a.out c != -1 c == (char)-1 % cc -qchars=signed char.c; ./a.out c == -1 c == (char)-1 % gcc char.c; ./a.out char.c: In function `main': char.c:5: warning: comparison is always 0 due to limited range of data type c != -1 c == (char)-1 % gcc -funsigned-char char.c; ./a.out char.c: In function `main': char.c:5: warning: comparison is always 0 due to limited range of data type c != -1 c == (char)-1 % gcc -fsigned-char char.c; ./a.out c == -1 c == (char)-1 % -- 小松克行 / Katsuyuki Komatsu