山本です。 >> marshal.c >> ../ruby/marshal.c(548) : warning C4761: 関数の仮引数と実引数のベース型が異なってい >> ます。実引数を仮引数の型に変換します。 >> ../ruby/marshal.c(146) : warning C4761: 関数の仮引数と実引数のベース型が異なってい >> ます。実引数を仮引数の型に変換します。 >> ../ruby/marshal.c(147) : warning C4761: 関数の仮引数と実引数のベース型が異なってい >> ます。実引数を仮引数の型に変換します。 >> ../ruby/marshal.c(168) : warning C4761: 関数の仮引数と実引数のベース型が異なってい >> ます。実引数を仮引数の型に変換します。 >> ../ruby/marshal.c(172) : warning C4761: 関数の仮引数と実引数のベース型が異なってい >> ます。実引数を仮引数の型に変換します。 >> ../ruby/marshal.c(367) : warning C4761: 関数の仮引数と実引数のベース型が異なってい >> ます。実引数を仮引数の型に変換します。 >> >> といった警告が残ってますが、bcc32 では警告は出ません。これは挙動を追う必要がありそうなので、 >> 後回しにしました。 > >この警告はVC7では出なくなってるようです。 なぜ警告が出るのか探していて見つけたのですが、 http://wisdom.sakura.ne.jp/programming/c/c13.html によると、int から char への変換は下位8ビットをマスクしたのと同じ挙動を 示すそうです。(言われてみると納得できる気もするのですが、なんか意外でした。 C++ の bool のような感覚で、なんとなく非負の int は非負の char になるように思い込んでました。) 符合があるときもこの挙動なのか、よく調べてませんが、これが本当なら marshal.c の & 0xff は char へのキャストに置き換えられると思います。 #include <stdio.h> void test(char c) /* int -> char */ { puts(c ? "non-zero" : "zero"); /* zero! */ } int main() { test(0x100); /* int */ } ただ、marshal.c の 548 行目の w_byte(rb_reg_options(obj), arg); だけは、 rb_reg_options が int を返してるので、現在は 256 以下に収まってますが 将来的にどうなのか・・・ # あと、やはり 256 以下に収まっているので今は問題にならないのですが、 # bignum.c は下のようにしたほうがいいと思います。 Index: bignum.c =================================================================== RCS file: /src/ruby/bignum.c,v retrieving revision 1.122 diff -u -w -b -p -r1.122 bignum.c --- bignum.c 12 Sep 2005 10:44:19 -0000 1.122 +++ bignum.c 13 Sep 2005 04:00:41 -0000 @@ -43,7 +43,7 @@ bignew_1(VALUE klass, long len, int sign { NEWOBJ(big, struct RBignum); OBJSETUP(big, klass, T_BIGNUM); - big->sign = (char)sign; + big->sign = sign?1:0; big->len = len; big->digits = ALLOC_N(BDIGIT, len); Index: marshal.c =================================================================== RCS file: /src/ruby/marshal.c,v retrieving revision 1.121 diff -u -w -b -p -r1.121 marshal.c --- marshal.c 12 Sep 2005 10:44:20 -0000 1.121 +++ marshal.c 13 Sep 2005 04:06:08 -0000 @@ -116,7 +116,7 @@ class2path(VALUE klass) static void w_long _((long, struct dump_arg*)); static void -w_nbyte(char *s, int n, struct dump_arg *arg) +w_nbyte(const char *s, int n, struct dump_arg *arg) { VALUE buf = arg->str; rb_str_buf_cat(buf, s, n); @@ -134,7 +134,7 @@ w_byte(char c, struct dump_arg *arg) } static void -w_bytes(char *s, int n, struct dump_arg *arg) +w_bytes(const char *s, int n, struct dump_arg *arg) { w_long(n, arg); w_nbyte(s, n, arg); @@ -143,8 +143,8 @@ w_bytes(char *s, int n, struct dump_arg static void w_short(int x, struct dump_arg *arg) { - w_byte((x >> 0) & 0xff, arg); - w_byte((x >> 8) & 0xff, arg); + w_byte((char)(x >> 0), arg); + w_byte((char)(x >> 8), arg); } static void @@ -165,11 +165,11 @@ w_long(long x, struct dump_arg *arg) return; } if (0 < x && x < 123) { - w_byte(x + 5, arg); + w_byte((char)(x + 5), arg); return; } if (-124 < x && x < 0) { - w_byte((x - 5)&0xff, arg); + w_byte((char)(x - 5), arg); return; } for (i=1;i<sizeof(long)+1;i++) { @@ -358,7 +358,7 @@ w_extended(VALUE klass, struct dump_arg } static void -w_class(int type, VALUE obj, struct dump_arg *arg, int check) +w_class(char type, VALUE obj, struct dump_arg *arg, int check) { char *path;