山本です。

># なお、io.c などコールバック関数側はそのままなので、まだ警告は出ます。

すみません、警告じゃなくてコンパイルエラーになりますね。出直します。

ふと思ったのですが、rb_define_virtual_variable では 

    VALUE (*getter)(ID id, VALUE *var);
    void  (*setter)(VALUE val, ID id, VALUE *var);

の VALUE *var は使われていないと思って

    VALUE (*getter)(ID id);
    void  (*setter)(VALUE val, ID id);

という違うコールバック型にしたのですが、var に NULL を渡すようにして
同じ型にしたほうがいいでしょうか?コールバックを書くときに混乱したので
(というか、そうすればunion を使わなくてもよかったかも)