山本です。 Takahiro Kambe <taca / back-street.net> wrote: (2005/09/12 00:29) > int main() > { > hoge(3,4); > hoge((VALUE)3,(VALUE)4); > } > >とかすると、 > >% ./a.out >3 134518828 >3 4 > >といった結果となり、 > > int main() > { > hoge((VALUE)3,(VALUE)4); > hoge(3,4); > } > >とかすると、 > >% ./a.out >3 4 >3 4 > >となりました。やっぱり、危険な匂いがしませんか。 やはり ANYARGS のままにするのは気持ち悪いものがありますね・・・・ Tanaka Akira <akr / m17n.org> wrote: (2005/09/12 00:56) >ただ、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 なるシステムではポインタと同じサイズの整数型が存在しな >いということを知ってしまったというのが理由です。 同感です。 #define IMMEDIATE_P(x) ((VALUE)(x) & IMMEDIATE_MASK) とかしている部分がそのままでは動かないので、修正が必要そうですが。