Регистрация функций C в Lua
Предоставляйте функции C скриптам Lua с помощью luaL_register и lua_pushcfunction.
«Регистрация функций C в Lua» — бесплатный урок Lua Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Обзор
Функции C можно предоставлять сценариям Lua. Они должны иметь сигнатуру int myFunc(lua_State *L). Они считывают аргументы из стека и помещают в него возвращаемые значения.
Сигнатура функции C
Каждая функция, вызываемая из Lua, является lua_CFunction: она принимает lua_State*, считывает аргументы, помещает результаты в стек и возвращает их количество.
// C code
static int l_add(lua_State *L) {
double a = luaL_checknumber(L, 1);
double b = luaL_checknumber(L, 2);
lua_pushnumber(L, a + b);
return 1; // one result
}Регистрация в качестве глобальной функции
lua_pushcfunction(L, l_add) помещает функцию C в стек, а затем lua_setglobal(L, "add") регистрирует её как глобальную в Lua.
// C code
lua_pushcfunction(L, l_add);
lua_setglobal(L, "add");
// Now Lua can call: add(3, 4)luaL_newlib / luaL_register
Зарегистрируйте набор функций C как модуль Lua с помощью массива luaL_Reg и функции luaL_newlib.
// C code
static const luaL_Reg mylib[] = {
{"add", l_add},
{"mul", l_mul},
{NULL, NULL}
};
luaL_newlib(L, mylib);
lua_setglobal(L, "mylib");
// Lua: mylib.add(1, 2)Чтение аргументов
luaL_checknumber(L, n), luaL_checkstring(L, n) и т. д. считывают и проверяют аргументы, вызывая ошибку Lua, если тип неверен.
Возврат нескольких значений
Поместите несколько значений в стек и верните их количество. Lua присвоит их как несколько возвращаемых значений.
// C code
static int l_divmod(lua_State *L) {
int a = luaL_checkinteger(L, 1);
int b = luaL_checkinteger(L, 2);
lua_pushinteger(L, a / b);
lua_pushinteger(L, a % b);
return 2; // two results
}Внешние значения для замыканий C
Замыкания C захватывают внешние значения во время регистрации с помощью lua_pushcclosure(L, fn, n). Получайте доступ к внешним значениям с помощью lua_upvalueindex(n).
Сообщение об ошибке из C
Вызовите luaL_error(L, format, ...), чтобы вызвать ошибку Lua из функции C. Эта функция никогда не возвращает управление — она выполняет longjmp к обработчику защищённого вызова.
// C code
if (divisor == 0)
luaL_error(L, "division by zero at argument %d", 2);Модуль C в формате .so/.dll
Модуль C предоставляет функцию luaopen_modname. require в Lua загружает общую библиотеку и вызывает эту функцию для инициализации модуля.
// C code (shared library entry point)
int luaopen_mymod(lua_State *L) {
luaL_newlib(L, mymod_funcs);
return 1;
}Проверка количества аргументов
Используйте lua_gettop(L), чтобы проверить количество переданных аргументов. luaL_checkany(L, n) гарантирует, что было передано как минимум n аргументов.
Альтернатива: LuaJIT FFI
FFI в LuaJIT позволяет вызывать функции C непосредственно из Lua без написания кода-обёртки на C. Для простых вызовов функций это часто удобнее. Для более глубокой интеграции необходим C API.
Вопрос о функции C
Что должна возвращать функция C, вызываемая из Lua?
Итоги: регистрация функций C
Функции C, вызываемые из Lua, имеют сигнатуру int f(lua_State*). Считывайте аргументы с помощью luaL_check*, помещайте результаты в стек и возвращайте их количество. Регистрируйте функции по отдельности с помощью lua_pushcfunction или группой с помощью luaL_newlib.
Часто задаваемые вопросы
Урок «Регистрация функций C в Lua» бесплатный?
Да — полный текст урока «Регистрация функций C в Lua» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Регистрация функций C в Lua»?
Предоставляйте функции C скриптам Lua с помощью luaL_register и lua_pushcfunction. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Регистрация функций C в Lua»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Модель стека C API Lua
- Вызов функций Lua из C
- Регистрация функций C в Lua
- Управление состоянием и обработка ошибок