1

我正在使用 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

4

1 回答 1

3

libffi 没有对联合的直接支持,但可以使用一个技巧来模拟它:

首先,ffi_type为并集的每个元素创建一个。用于ffi_prep_cif布局类型的副作用。(您也可以使用ffi_get_struct_offsets,但这是非常新的。)

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

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

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

于 2016-11-01T18:14:22.463 回答