Registrering af C-funktioner i Lua
Eksponér C-funktioner for Lua-scripts med luaL_register og lua_pushcfunction.
Registrering af C-funktioner i Lua er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.
Oversigt
C-funktioner kan eksponeres for Lua-scripts. De skal have signaturen int myFunc(lua_State *L). De læser argumenter fra stakken og skubber returværdier på den.
C-funktionssignatur
Alle funktioner, der kan kaldes fra Lua, er en lua_CFunction: Den modtager en lua_State*, læser argumenter, skubber resultater på stakken og returnerer antallet af resultater.
// 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
}Registrering som global
lua_pushcfunction(L, l_add) skubber C-funktionen på stakken, hvorefter lua_setglobal(L, "add") registrerer den som en global i Lua.
// C code
lua_pushcfunction(L, l_add);
lua_setglobal(L, "add");
// Now Lua can call: add(3, 4)luaL_newlib / luaL_register
Registrér en gruppe C-funktioner som et Lua-modul ved hjælp af et luaL_Reg-array og 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æsning af argumenter
luaL_checknumber(L, n), luaL_checkstring(L, n) osv. læser og validerer argumenter og udløser en Lua-fejl, hvis typen er forkert.
Returnering af flere værdier
Skub flere værdier på stakken, og returnér deres antal. Lua tildeler dem som flere returværdier.
// 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 for C-closures
C-closures indfanger upvalues ved registreringstidspunktet ved hjælp af lua_pushcclosure(L, fn, n). Få adgang til upvalues med lua_upvalueindex(n).
Fejlrapportering fra C
Kald luaL_error(L, format, ...) for at udløse en Lua-fejl fra en C-funktion. Den returnerer aldrig — den laver et longjmp til håndteringen af det beskyttede kald.
// C code
if (divisor == 0)
luaL_error(L, "division by zero at argument %d", 2);C-modul som en .so/.dll
Et C-modul eksponerer en luaopen_modname-funktion. Lua's require indlæser det delte bibliotek og kalder funktionen for at initialisere modulet.
// C code (shared library entry point)
int luaopen_mymod(lua_State *L) {
luaL_newlib(L, mymod_funcs);
return 1;
}Kontrol af antal argumenter
Brug lua_gettop(L) til at kontrollere antallet af overførte argumenter. luaL_checkany(L, n) sikrer, at der blev angivet mindst n argumenter.
Alternativet LuaJIT FFI
LuaJIT's FFI lader dig kalde C-funktioner direkte fra Lua uden at skrive C-wrapperkode. Det er ofte enklere ved rene funktionskald. C API'et er nødvendigt ved dybere integration.
Spørgsmål om C-funktioner
Hvad skal en C-funktion, der kan kaldes fra Lua, returnere?
Opsummering: Registrering af C-funktioner
C-funktioner, der kan kaldes fra Lua, har signaturen int f(lua_State*). Læs argumenter med luaL_check*, skub resultater på stakken, og returnér antallet. Registrér dem enkeltvis med lua_pushcfunction eller samlet med luaL_newlib.
Lær Lua med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 40
- Lektioner
- 159
Ofte stillede spørgsmål
Er lektionen “Registrering af C-funktioner i Lua” gratis?
Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Registrering af C-funktioner i Lua”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Registrering af C-funktioner i Lua”?
Eksponér C-funktioner for Lua-scripts med luaL_register og lua_pushcfunction. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Lua Academy?
Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Registrering af C-funktioner i Lua”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Lua Academy-lektion?
Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Stackmodellen i Lua C API
- Kald af Lua-funktioner fra C
- Registrering af C-funktioner i Lua
- Håndtering af tilstand og fejl