2016-11-01 9 views
1

Я использую libffi для вызова функции, которая ожидает аргумент типа объединения.Как создать `ffi_type`, который представляет объединение?

Я не уверен, какие правила предназначены для создания структуры 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?

ответ

2

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

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

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

Этот поддельный тип - это ваш тип объединения.

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

+1

Должен ли использоваться «можно эмулировать с помощью _one weird trick_» – nielsbot

+1

Возможно, стоит также отметить, что это описано в руководстве сейчас; хотя, возможно, еще не в релизе. –

 Смежные вопросы

  • Нет связанных вопросов^_^