Вызов функций Lua из C
Загружайте и выполняйте скрипты и функции Lua из кода C.
«Вызов функций Lua из C» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Обзор
Чтобы вызвать функцию Lua из C, поместите в стек функцию, поместите аргументы, вызовите lua_pcall, а затем считайте результаты из стека.
Загрузка сценария Lua
luaL_dofile(L, filename) загружает и выполняет файл Lua. Либо используйте luaL_loadfile и lua_pcall для раздельной загрузки и вызова.
// C code
if (luaL_dofile(L, "config.lua") != LUA_OK) {
fprintf(stderr, "Error: %s\n", lua_tostring(L, -1));
lua_pop(L, 1);
}Получение глобальной функции
Используйте lua_getglobal(L, "funcName"), чтобы поместить глобальную функцию Lua в стек.
// C code
lua_getglobal(L, "myFunction"); // push function
lua_pushnumber(L, 10); // push arg1
lua_pushnumber(L, 20); // push arg2lua_pcall
lua_pcall(L, nargs, nresults, errfunc) вызывает функцию в стеке. При успехе возвращает LUA_OK и оставляет результаты в стеке.
// C code
if (lua_pcall(L, 2, 1, 0) != LUA_OK) {
fprintf(stderr, "Call error: %s\n", lua_tostring(L, -1));
lua_pop(L, 1);
} else {
double result = lua_tonumber(L, -1);
lua_pop(L, 1);
printf("Result: %f\n", result);
}Несколько возвращаемых значений
Укажите nresults в lua_pcall, чтобы считывать несколько возвращаемых значений. Они помещаются в стек по порядку.
// C: calling a Lua fn that returns two values
lua_getglobal(L, "minmax");
lua_pushnumber(L, 5); lua_pushnumber(L, 3);
lua_pcall(L, 2, 2, 0);
double mn = lua_tonumber(L, -2);
double mx = lua_tonumber(L, -1);
lua_pop(L, 2);LUA_MULTRET
Передайте LUA_MULTRET в качестве nresults, чтобы принять все возвращаемые функцией значения. После этого проверьте lua_gettop(L), чтобы узнать, сколько значений было возвращено.
Обработчик ошибок
Передайте ненулевой errfunc в lua_pcall, чтобы использовать пользовательский обработчик ошибок. Обработчик получает объект ошибки и может добавить информацию о трассировке стека.
// C: setup traceback handler
lua_getglobal(L, "debug");
lua_getfield(L, -1, "traceback");
lua_remove(L, -2); // remove debug table
int errhandler = lua_gettop(L);
// push fn and args, then:
lua_pcall(L, nargs, nresults, errhandler);Вызов методов объектов
Чтобы вызвать метод объекта Lua, поместите в стек метод, поместите объект (self), поместите остальные аргументы, а затем выполните вызов.
Передача таблиц в качестве аргументов
Создайте таблицу в стеке с помощью lua_newtable, заполните её поля с помощью lua_setfield, а затем передайте её как аргумент функции.
Реестр ссылок
Используйте luaL_ref(L, LUA_REGISTRYINDEX), чтобы сохранить значение Lua в реестре и получить целочисленный ключ для последующего извлечения.
// C: store a callback for later use
lua_pushvalue(L, callbackIdx);
int ref = luaL_ref(L, LUA_REGISTRYINDEX);
// Later: lua_rawgeti(L, LUA_REGISTRYINDEX, ref);Очистка
Всегда извлекайте из стека неиспользуемые значения. Несбалансированный стек увеличивается после множества вызовов и в итоге переполняется. Проверяйте размер стека в отладочных сборках.
Вопрос о lua_pcall
Что делает lua_pcall(L, 2, 1, 0)?
Итоги: вызов Lua из C
Поместите в стек функцию и аргументы, вызовите lua_pcall, проверьте код возврата, а затем считайте результаты из стека. Используйте luaL_ref, чтобы сохранить обратные вызовы Lua для последующего использования. Всегда извлекайте неиспользуемые значения из стека.
Часто задаваемые вопросы
Урок «Вызов функций Lua из C» бесплатный?
Да — полный текст урока «Вызов функций Lua из C» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Вызов функций Lua из C»?
Загружайте и выполняйте скрипты и функции Lua из кода C. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Вызов функций Lua из C»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Модель стека C API Lua
- Вызов функций Lua из C
- Регистрация функций C в Lua
- Управление состоянием и обработка ошибок