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]