Как мне создать `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.