Вызов функций C через FFI
Вызывайте функции libc и пользовательских динамических библиотек из Lua без дополнительных накладных расходов.
«Вызов функций C через FFI» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Прямые вызовы функций C
После объявления с помощью ffi.cdef функции C вызываются через объект библиотеки точно так же, как функции Lua. Аргументы и возвращаемые значения преобразуются автоматически.
local ffi = require("ffi")
ffi.cdef[[ double sin(double x); ]]
local m = ffi.load("m")
print(m.sin(math.pi / 2)) -- 1.0Преобразование типов
По умолчанию числа Lua преобразуются в C double. FFI автоматически преобразует их в объявленный тип параметра C. Логические значения преобразуются в 0/1. Строки преобразуются в const char*.
Вызов printf
printf — вариативная функция C. Вызывайте её через ffi.C.printf, передавая строку формата и аргументы.
ffi.cdef[[ int printf(const char *fmt, ...); ]]
ffi.C.printf("Sum: %d\n", 42)Обработка возвращаемых значений
Возвращаемые значения C автоматически преобразуются в типы Lua. Целые числа становятся числами Lua, а char* — lightuserdata (используйте ffi.string для преобразования).
ffi.cdef[[ char *getenv(const char *name); ]]
local ptr = ffi.C.getenv("HOME")
if ptr ~= nil then
print(ffi.string(ptr))
endffi.string
ffi.string(ptr, len) преобразует указатель char* в строку Lua. Без len функция читает данные до нулевого байта.
Обработка ошибок
Функции C возвращают коды ошибок или устанавливают errno. Явно проверяйте возвращаемые значения. Получить errno можно через ffi.errno().
ffi.cdef[[ int open(const char *path, int flags); ]]
local fd = ffi.C.open("missing.txt", 0)
if fd < 0 then
print("Error:", ffi.errno())
endАргументы-структуры
Передавайте структуры C по значению или через указатель. Создавайте их с помощью ffi.new.
ffi.cdef[[
typedef struct { int x, y; } Point;
void printPoint(Point p);
]]
local p = ffi.new("Point", {x=3, y=4})
lib.printPoint(p)Аргументы-указатели
Передавайте указатели на выходные данные функциям, которые возвращают несколько значений через параметры-указатели.
ffi.cdef[[
void minmax(double *arr, int n, double *min, double *max);
]]
local arr = ffi.new("double[5]", {5,2,8,1,9})
local mn, mx = ffi.new("double[1]"), ffi.new("double[1]")
lib.minmax(arr, 5, mn, mx)
print(mn[0], mx[0])Производительность вызовов FFI
Вызовы функций C через FFI имеют почти нулевые накладные расходы — они значительно быстрее вызовов из Lua в C через традиционный API C. JIT часто может полностью встроить такой вызов.
Вариативные функции
Вариативные функции C (...) необходимо вызывать с правильными типами. При необходимости передавайте явные приведения типов, чтобы избежать неоднозначности.
ffi.C.printf("%d %f\n", ffi.cast("int", 42), ffi.cast("double", 3.14))Правила безопасности
Всегда проверяйте возвращаемые указатели на NULL. Никогда не передавайте освобождённый указатель или указатель, вышедший из области действия. Используйте ffi.gc, чтобы прикреплять финализаторы к выделенной в C памяти.
Вопрос о вызовах FFI
Как FFI преобразует строку Lua в C const char*?
Итоги: вызов C через FFI
Вызывайте функции C через объект библиотеки так же, как функции Lua. FFI выполняет преобразование типов. Используйте ffi.string для возвращаемых значений char*, ffi.errno() для обработки ошибок и ffi.new для аргументов-структур и массивов.
Часто задаваемые вопросы
Урок «Вызов функций C через FFI» бесплатный?
Да — полный текст урока «Вызов функций C через FFI» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Вызов функций C через FFI»?
Вызывайте функции libc и пользовательских динамических библиотек из Lua без дополнительных накладных расходов. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Вызов функций C через FFI»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы FFI: ffi.cdef и ffi.load
- Вызов функций C через FFI
- Указатели, структуры и массивы в FFI
- Обратные вызовы: передача функций Lua в C