Как мне создать `ffi_type`, который представляет объединение?

Я использую 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 ответ

Решение

libffi не имеет прямой поддержки союзов, но ее можно эмулировать, используя хитрость:

Во-первых, сделать ffi_type для каждого элемента союза. использование ffi_prep_cif для его побочного эффекта выкладывания типа. (Ты можешь использовать ffi_get_struct_offsets как хорошо, но это очень ново.)

Затем создайте тип объединения как FFI_TYPE_STRUCT, Дайте ему один элемент - но убедитесь, что это самый большой тип с первого шага. Кроме того, убедитесь, что этот элемент имеет самое строгое (наибольшее) выравнивание из всех выравниваний с первого шага (это можно сделать, установив выравнивание вручную).

Этот поддельный тип - ваш тип профсоюза.

В трекере libffi есть, по крайней мере, одно сообщение об ошибке, в котором говорится, что этот трюк не работает для некоторых ABI. Насколько я знаю, никто не исследовал, правда ли это; но если так, то это говорит о добавлении реальной поддержки объединения непосредственно в libffi.

Другие вопросы по тегам