如何创建代表联合的“ffi_type”?
How do I create an `ffi_type` that represents a union?
我正在使用 libffi 调用需要联合类型参数的函数。
我不确定创建描述联合类型的 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
的正确结构是什么?
libffi 不直接支持联合,但可以使用一个技巧来模拟它:
首先,为并集的每个元素创建一个ffi_type
。使用 ffi_prep_cif
布局类型的副作用。 (您也可以使用 ffi_get_struct_offsets
,但这是非常新的。)
接下来,将联合类型设置为FFI_TYPE_STRUCT
。给它一个成员——但要确保它是第一步中最大的类型。另外,请确保此成员具有第一步中所有对齐中最严格(最大)的对齐方式(您可以通过手动设置对齐方式来做到这一点)。
这个伪造的类型就是你的联合类型。
libffi 跟踪器中至少有一个错误报告说这个技巧对某些 ABI 不起作用。据我所知,没有人调查过这是否属实;但如果是这样,它主张直接在 libffi 中添加真正的联合支持。
我正在使用 libffi 调用需要联合类型参数的函数。
我不确定创建描述联合类型的 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
的正确结构是什么?
libffi 不直接支持联合,但可以使用一个技巧来模拟它:
首先,为并集的每个元素创建一个ffi_type
。使用 ffi_prep_cif
布局类型的副作用。 (您也可以使用 ffi_get_struct_offsets
,但这是非常新的。)
接下来,将联合类型设置为FFI_TYPE_STRUCT
。给它一个成员——但要确保它是第一步中最大的类型。另外,请确保此成员具有第一步中所有对齐中最严格(最大)的对齐方式(您可以通过手动设置对齐方式来做到这一点)。
这个伪造的类型就是你的联合类型。
libffi 跟踪器中至少有一个错误报告说这个技巧对某些 ABI 不起作用。据我所知,没有人调查过这是否属实;但如果是这样,它主张直接在 libffi 中添加真正的联合支持。