質問: ((s)[(i)>>1] & (0xf0 >> ((~(i)&1)<<2))) | ((b)<<((~(i)&1)<<2))) ``` 型を決め打ちしてしまって大丈夫かな?という問題もあります。 しかし、それ以前にマクロは単にソースコードを置換するものだということなので ruby-ffi の`attach_function` または fiddle の `extern` を使ってもこれら関数を追加できないのではないかと思います。(違っていたらごめんなさい) こういった関数形式マクロを追加したい場合は、どのような方法が考えられますでしょうか? 教えていただけると助かります。
回答: ruby-ffiが呼び出すのはライブラリのソースコードではなく、コンパイルされたバイナリ(`.so`など)です。バイナリには関数名(シンボル)が含まれているので、ruby-ffiはそれを使うことになります。ところが、マクロはコンパイル時に展開されバイナリには含まれませんので、ruby-ffiはマクロの定義や、そもそもマクロが使われたかどうかすらわかりません。したがって、仰る通り`attach_function`を使ってマクロを呼び出すことはできません。 このようなマクロに相当する処理を実現するには、以下のような方法が考えられます。 * Rubyでマクロを再現する。質問の例であれば、プロパティにアクセスする手段があればそれほど難しくないと思います。 * C言語でマクロをラッパー関数として実装しなおして(引数・返り値の型を別途定めることになります)、ruby-ffiからはそのラッパーを呼び出す。構造体のメンバーにアクセスする関数が提供されていない場合でも、こちらの方法が使えます。 参考:FFI: Foreign Function Interfaces for Fun & Industry