In article <20050911231940.FEA1DBE8.ocean / m2.ccsnet.ne.jp>, H.Yamamoto <ocean / m2.ccsnet.ne.jp> writes: > http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide37-1.html にこのことについて説明があり > ました。「規定の実引数拡張」というらしいです。これによるとコールバック関数は int か > double しか使えないということになります。 小さくすることはないので int や double よりも大きいものは使えると思い ますが。 ただ、rb_thread_create についていえば引数は VALUE (*)(VALUE) で受けて VALUE (*)(VALUE, rb_thread_t) に cast してから rb_thread_start_0 にわ たせばいいことだと思います。 もちろん、(ANSI C では保証されないけれど) 引数の個数が少なくても呼べる と信じるなら、ですが。まぁ、固定引数の関数に余計な引数与えて呼ぶのはそ れほど分の悪い賭けではないと思います。 一般に、関数の型に全部 prototype をつけるのは、そういう暗黙の期待を明 示的に書くようにするだけの話で、cast を入れる以上にコードを変更する必 要はないのではないか、と思っているんですが。 > というわけで、放置するのは良くないような気がしてきました。typedef void* VALUE とすれば > 64bit 環境でも問題ない可能性はありますが、そのかわりコールバック側で VALUE * で受けたり、 > struct のポインタで受けたりはできなくなるんじゃないでしょうか。 ここで述べられている理由はよくわかりませんが、個人的には VALUE は void* にするのが適切であろうと思っています。 それは、AS/400 なるシステムではポインタと同じサイズの整数型が存在しな いということを知ってしまったというのが理由です。 -- [田中 哲][たなか あきら][Tanaka Akira]