Lua Academy · Lektion

Registrera C-funktioner i Lua

Exponera C-funktioner för Lua-skript med luaL_register och lua_pushcfunction.

Lektion 3 av 413 steg

Registrera C-funktioner i Lua är en gratis lektion i Lua Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Lua Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Lua Academy innehåller totalt 4 lektioner.

Översikt

C-funktioner kan exponeras för Lua-skript. De måste ha signaturen int myFunc(lua_State *L). De läser argument från stacken och lägger returvärden på den.

C-funktionssignatur

Varje funktion som kan anropas från Lua är en lua_CFunction: den tar emot en lua_State*, läser argument, lägger resultat på stacken och returnerar antalet resultat.

// 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
}

Registrera som global

lua_pushcfunction(L, l_add) lägger C-funktionen på stacken. Därefter registrerar lua_setglobal(L, "add") den som en global funktion i Lua.

// C code
lua_pushcfunction(L, l_add);
lua_setglobal(L, "add");
// Now Lua can call: add(3, 4)

luaL_newlib / luaL_register

Registrera en grupp C-funktioner som en Lua-modul med hjälp av en luaL_Reg-array och 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)

Läsa argument

luaL_checknumber(L, n), luaL_checkstring(L, n) och så vidare läser och validerar argument. Vid fel typ utlöses ett Lua-fel.

Returnera flera värden

Lägg flera värden på stacken och returnera deras antal. Lua tilldelar dem som flera returvärden.

// 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
}

Upvalues för C-closures

C-closures fångar upvalues när de registreras med lua_pushcclosure(L, fn, n). Kom åt upvalues med lua_upvalueindex(n).

Felrapportering från C

Anropa luaL_error(L, format, ...) för att utlösa ett Lua-fel från en C-funktion. Funktionen returnerar aldrig – den gör en longjmp till hanteraren för det skyddade anropet.

// C code
if (divisor == 0)
  luaL_error(L, "division by zero at argument %d", 2);

C-modul som .so/.dll

En C-modul exponerar en luaopen_modname-funktion. Lua:s require läser in det delade biblioteket och anropar funktionen för att initiera modulen.

// C code (shared library entry point)
int luaopen_mymod(lua_State *L) {
  luaL_newlib(L, mymod_funcs);
  return 1;
}

Kontrollera antalet argument

Använd lua_gettop(L) för att kontrollera antalet skickade argument. luaL_checkany(L, n) säkerställer att minst n argument har angetts.

Alternativet LuaJIT FFI

LuaJIT:s FFI låter er anropa C-funktioner direkt från Lua utan att skriva C-kod för omslag. Det är ofta enklare för rena funktionsanrop. C API behövs för djupare integration.

Fråga om C-funktioner

Vad måste en C-funktion som kan anropas från Lua returnera?

Sammanfattning: registrera C-funktioner

C-funktioner som kan anropas från Lua har signaturen int f(lua_State*). Läs argument med luaL_check*, lägg resultat på stacken och returnera antalet. Registrera funktioner enskilt med lua_pushcfunction eller i grupp med luaL_newlib.

Gratis att börja

Lär dig Lua med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
40
Lektioner
159

Vanliga frågor

Är lektionen ”Registrera C-funktioner i Lua” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lua Academy, inklusive ”Registrera C-funktioner i Lua”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Lua Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Registrera C-funktioner i Lua”?

Exponera C-funktioner för Lua-skript med luaL_register och lua_pushcfunction. Ni övar på Lua Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Lua Academy?

Du behöver inga förkunskaper. Utbildningen i Lua Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Registrera C-funktioner i Lua”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Lua Academy-lektionen?

Ja. Varje Lua Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Stackmodellen i Lua:s C-API
  2. Anropa Lua-funktioner från C
  3. Registrera C-funktioner i Lua
  4. Hantera tillstånd och fel
← Tillbaka till Lua Academy