2016-11-01 7 views
1

私は、共用体型の引数を必要とする関数を呼び出すためにlibffiを使用しています。共用体を表す `ffi_type`を作成するにはどうしたらいいですか?

ユニオンタイプを記述するffi_type構造体を作成するためのルールが正確にはわかりません。たとえば、次のような場合:

union Vector4 
{ 
    struct { float x, y, z, w; }; 
    struct { float r, g, b, a; }; 
    struct { float s, t, p, q; }; 
    float v[4]; 
} 

ffi_typeの正しい構造は何ですか?

答えて

2

libffiが労働組合を直接サポートしていませんが、それはトリックを使用してエミュレートすることができます。

まず、組合の各要素に対してffi_typeを作ります。型のレイアウトの副作用としてffi_prep_cifを使用してください。 (ffi_get_struct_offsetsも使用できますが、これは新しいものです)

次に、ユニオンタイプをFFI_TYPE_STRUCTとしてください。単一のメンバーを与えますが、それが最初のステップから最大のタイプであることを確認してください。また、このメンバーが最初のステップからのすべてのアライメントの最も厳密な(最大の)アラインメントを持っていることを確認してください(アライメントを手動で設定することでこれを行うことができます)。

この偽装タイプは、あなたのユニオンタイプです。

libickiトラッカーには、このトリックが一部のABIでは機能しないというバグレポートが少なくとも1つあります。私が知っている限り、これが本当かどうかは誰も調べていません。もしそうなら、それはlibffiで実際の組合サポートを直接追加することを主張します。

+1

"奇妙なトリック_を使ってエミュレートすることができます" – nielsbot

+1

これはマニュアルに記載されていることに気付く価値があります。おそらくまだリリースされていないかもしれません。 –

関連する問題