山本です。 >([ruby-dev:26998]のようにプロトタイプがないとおかしくなる場合はこの技は使えませんが > あれって double でだけ起きるのかな・・・) http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide37-1.html にこのことについて説明があり ました。「規定の実引数拡張」というらしいです。これによるとコールバック関数は int か double しか使えないということになります。 斎藤ただしさんに紹介していただいた C99 の仕様では「いずれの型も文字列型または void のポインタの場合は例外」とあるのですが、ruby は unsigned long または unsigned long long なので、int と long のサイズが違う環境(64bit環境?)では まずいことが起きそうです。 >C99相当の邦訳、JIS X 3010:2003が、実は無償で公開されています。 > http://www.jisc.go.jp/ > から「JIS検索」→「JIS規格番号からJISを検索」にX3010を入力 >で見られるPDFがそれです。 実際、Windows でも #include <stdio.h> typedef __int64 VALUE; static void hoge(); int main() { hoge(3,4); } static void hoge(VALUE i, VALUE j) { printf("%d %d\n", (int)i, (int)j); /* 3 844556250 */ } とすると、異常な値が出力されます。 >>この辺はANSI prototypeによるうれしさとはあんまり関係ないんで、 >>古い形式のまま放置するってわけにはいかないんですかね。 > >どうでしょう・・・C の仕様書がないのでなんともいえません。でも、今より悪くなるわけは >ないので、とりあえず放置するのも方法のような気もしてきました。 というわけで、放置するのは良くないような気がしてきました。typedef void* VALUE とすれば 64bit 環境でも問題ない可能性はありますが、そのかわりコールバック側で VALUE * で受けたり、 struct のポインタで受けたりはできなくなるんじゃないでしょうか。