Rejestrowanie funkcji C w Lua
Proszę udostępniać funkcje C skryptom Lua za pomocą luaL_register i lua_pushcfunction.
Rejestrowanie funkcji C w Lua to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Wprowadzenie
Funkcje C można udostępniać skryptom Lua. Muszą mieć sygnaturę int myFunc(lua_State *L). Odczytują argumenty ze stosu i umieszczają na nim wartości zwracane.
Sygnatura funkcji C
Każda funkcja, którą można wywołać z Lua, jest typu lua_CFunction: przyjmuje lua_State*, odczytuje argumenty, umieszcza wyniki i zwraca ich liczbę.
// 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
}Rejestrowanie jako globalnej
lua_pushcfunction(L, l_add) umieszcza funkcję C na stosie, a następnie lua_setglobal(L, "add") rejestruje ją jako funkcję globalną w Lua.
// C code
lua_pushcfunction(L, l_add);
lua_setglobal(L, "add");
// Now Lua can call: add(3, 4)luaL_newlib / luaL_register
Zarejestruj zestaw funkcji C jako moduł Lua, używając tablicy luaL_Reg i funkcji 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)Odczytywanie argumentów
luaL_checknumber(L, n), luaL_checkstring(L, n) itd. odczytują i sprawdzają poprawność argumentów, zgłaszając błąd Lua, jeśli typ jest nieprawidłowy.
Zwracanie wielu wartości
Umieść na stosie wiele wartości i zwróć ich liczbę. Lua przypisze je jako wiele wartości zwracanych.
// 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
}Wartości upvalue w domknięciach C
Domknięcia C przechwytują wartości upvalue podczas rejestracji za pomocą lua_pushcclosure(L, fn, n). Dostęp do wartości upvalue uzyskuje się przez lua_upvalueindex(n).
Zgłaszanie błędów z C
Wywołaj luaL_error(L, format, ...), aby zgłosić błąd Lua z funkcji C. Funkcja ta nigdy nie wraca — wykonuje longjmp do procedury obsługi chronionego wywołania.
// C code
if (divisor == 0)
luaL_error(L, "division by zero at argument %d", 2);Moduł C jako .so/.dll
Moduł C udostępnia funkcję luaopen_modname. Lua używa funkcji require do załadowania biblioteki współdzielonej i wywołuje tę funkcję w celu zainicjowania modułu.
// C code (shared library entry point)
int luaopen_mymod(lua_State *L) {
luaL_newlib(L, mymod_funcs);
return 1;
}Sprawdzanie liczby argumentów
Użyj lua_gettop(L), aby sprawdzić liczbę przekazanych argumentów. luaL_checkany(L, n) zapewnia, że przekazano co najmniej n argumentów.
Alternatywa: LuaJIT FFI
FFI w LuaJIT pozwala wywoływać funkcje C bezpośrednio z Lua, bez pisania kodu opakowującego w C. Często jest to prostsze w przypadku wywołań czystych funkcji. API C jest potrzebne do głębszej integracji.
Pytanie o funkcje C
Co musi zwracać funkcja C, którą można wywołać z Lua?
Podsumowanie: rejestrowanie funkcji C
Funkcje C wywoływane z Lua mają sygnaturę int f(lua_State*). Odczytuj argumenty za pomocą luaL_check*, umieszczaj wyniki na stosie i zwracaj ich liczbę. Rejestruj funkcje pojedynczo przez lua_pushcfunction albo zbiorczo przez luaL_newlib.
Często zadawane pytania
Czy lekcja „Rejestrowanie funkcji C w Lua” jest bezpłatna?
Tak — pełny tekst „Rejestrowanie funkcji C w Lua” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Rejestrowanie funkcji C w Lua”?
Proszę udostępniać funkcje C skryptom Lua za pomocą luaL_register i lua_pushcfunction. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Rejestrowanie funkcji C w Lua”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Model stosu Lua C API
- Wywoływanie funkcji Lua z C
- Rejestrowanie funkcji C w Lua
- Zarządzanie stanem i obsługa błędów