0Pricing
Lua Academy · Lekcja

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

  1. Model stosu Lua C API
  2. Wywoływanie funkcji Lua z C
  3. Rejestrowanie funkcji C w Lua
  4. Zarządzanie stanem i obsługa błędów
← Powrót do Lua Academy