Как мне получить доступ к типу в библиотеке C в Crystal FFI?

#sqlite #ffi #crystal-lang

#sqlite #ffi #crystal-lang

Вопрос:

Задача, над которой я работаю, — добавить поддержку create_function интерфейса к привязке SQLite в Crystal: https://github.com/crystal-lang/crystal-sqlite3/issues/61

Чтобы получить доступ к параметрам для определяемой пользователем функции, мне нужно получить доступ к массиву в стиле C (то есть указателю на смежные экземпляры) sqlite3_value типа, который, если я не ошибаюсь, требует знания размера типа. Но, насколько я обнаружил, нет способа объявить тип Crystal в качестве псевдонима для типа, определенного в библиотеке C.

Ответ №1:

Поскольку это указатель, нет, вам не обязательно знать его расположение. Для непрозрачных указателей этот шаблон распространен в Crystal:

 type Sqlite3Context = Void*
type Sqlite3Value = Void*

fun sqlite3_create_function(
  [...]
  xFunc : (Sqlite3Context, Int, Sqlite3Value*) ->,
  [...]
)
  

Комментарии:

1. Спасибо. Я забыл, что это два уровня указателей, а не просто указатель на массив структур. Это фактически решило мою проблему! Хотя я все равно хотел бы знать, есть ли способ получить размер типа, определенного в библиотеке C.