In article <200509121252.j8CCqVZD010059 / sharui.nakada.niregi.kanuma.tochigi.jp>,
  nobu / ruby-lang.org writes:

>> ただ、rb_thread_create についていえば引数は VALUE (*)(VALUE) で受けて
>> VALUE (*)(VALUE, rb_thread_t) に cast してから rb_thread_start_0 にわ
>> たせばいいことだと思います。
>
> 関数ポインタのキャストは基本的に避けたほうが無難じゃないでしょ
> うか。

基本的にはそのとおりだと思います。

そして、ANSI C な prototype をつけたことにより、引数の食い違いを避ける
方向に力が働くのは良いことです。

ただ、今まで食い違っていても動いていたように、かならずしも食い違いが即
座に問題を引き起こすわけでは無いのも事実ではあります。そのことは
prototype の有無とはあまり関係ありません。

> rb_thread_tが必要なら、opaqueな型でtypedefしておくので充
> 分だと思います。

rb_thread_create については、引数に与える関数を 2引数にするのは不適切
だと思います。rb_thread_create は外部に公開している関数で、その引数と
して使われる関数は Ruby 本体だけが用意するわけではありません。そのよう
な関数で、使っちゃいけないんだけどひとつ引数を加えて定義するよう要求す
るのは不自然です。

私が食い違いを防ぐなら、rb_thread_yield かどうかを調べて呼び分けると思
います。まつもとさんはそれを [ruby-dev:27012] で無駄な条件分岐と断じて
いますが。

ちなみに、その条件分岐が無駄でない (問題が発生する) 例がないか、かなり
調べたのですが、いまのところ見つかっていません。

>> それは、AS/400 なるシステムではポインタと同じサイズの整数型が存在しな
>> いということを知ってしまったというのが理由です。
>
> ということは関数ポインタをcastして呼び出すことは保証されないん
> じゃないでしょうか。

えーと、たしかに整数型を経由する cast を行えばあからさまに動きそうにな
いですが、rb_thread_create については
VALUE (*)(VALUE) から
VALUE (*)(VALUE, rb_thread_t) への cast であって整数型を経由しないので、
ここで述べた AS/400 の話とはあまり関係ないように思います。
-- 
[田中 哲][たなか あきら][Tanaka Akira]