如何创建表示联合的`ffi_type`?

时间:2016-11-01 05:17:30

标签: c unions ffi 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的正确结构是什么?

1 个答案:

答案 0 :(得分:2)

libffi没有对工会的直接支持,但可以使用技巧进行模拟:

首先,为联合的每个元素创建一个ffi_type。使用ffi_prep_cif来说明其布局类型的副作用。 (您也可以使用ffi_get_struct_offsets,但这非常新。)

接下来,将联合类型设为FFI_TYPE_STRUCT。给它一个成员 - 但要确保它是第一步中最大的类型。此外,请确保此成员具有第一步中所有对齐的最严格(最大)对齐(您可以通过手动设置对齐来执行此操作)。

这种伪造类型是你的联合类型。

libffi跟踪器中至少有一个错误报告说这个技巧对某些ABI不起作用。据我所知,没有人调查过这是否属实;但如果是这样,它主张在libffi中直接添加真正的联合支持。