Registrando funções C no Lua
Exponha funções C a scripts Lua usando luaL_register e lua_pushcfunction.
Registrando funções C no Lua é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.
Visão geral
Funções C podem ser expostas a scripts Lua. Elas devem ter a assinatura int myFunc(lua_State *L). Elas leem argumentos da pilha e colocam os valores retornados nela.
Assinatura de uma função C
Toda função que pode ser chamada a partir de Lua é uma lua_CFunction: recebe um lua_State*, lê argumentos, coloca resultados na pilha e retorna a quantidade de resultados.
// 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
}Registrando como global
lua_pushcfunction(L, l_add) coloca a função C na pilha; em seguida, lua_setglobal(L, "add") registra-a como global em Lua.
// C code
lua_pushcfunction(L, l_add);
lua_setglobal(L, "add");
// Now Lua can call: add(3, 4)luaL_newlib / luaL_register
Registre um conjunto de funções C como um módulo Lua usando uma matriz luaL_Reg e 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)Lendo argumentos
luaL_checknumber(L, n), luaL_checkstring(L, n) etc. leem e validam argumentos, gerando um erro Lua se o tipo estiver incorreto.
Retornando vários valores
Coloque vários valores na pilha e retorne a quantidade deles. Lua os atribuirá como vários valores retornados.
// 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 para closures C
Closures C capturam upvalues no momento do registro usando lua_pushcclosure(L, fn, n). Acesse os upvalues com lua_upvalueindex(n).
Relatando erros a partir de C
Chame luaL_error(L, format, ...) para gerar um erro Lua a partir de uma função C. Essa chamada nunca retorna — ela executa um longjmp até o manipulador da chamada protegida.
// C code
if (divisor == 0)
luaL_error(L, "division by zero at argument %d", 2);Módulo C como .so/.dll
Um módulo C expõe uma função luaopen_modname. O require de Lua carrega a biblioteca compartilhada e a chama para inicializar o módulo.
// C code (shared library entry point)
int luaopen_mymod(lua_State *L) {
luaL_newlib(L, mymod_funcs);
return 1;
}Verificação da quantidade de argumentos
Use lua_gettop(L) para verificar a quantidade de argumentos passados. luaL_checkany(L, n) garante que pelo menos n argumentos foram fornecidos.
Alternativa FFI do LuaJIT
A FFI do LuaJIT permite chamar funções C diretamente a partir de Lua sem escrever código wrapper em C. Ela costuma ser mais simples para chamadas de funções puras. A API C é necessária para integrações mais profundas.
Pergunta sobre funções C
O que uma função C que pode ser chamada por Lua deve retornar?
Recapitulação: registrando funções C
As funções C que podem ser chamadas por Lua têm a assinatura int f(lua_State*). Leia os argumentos com luaL_check*, coloque os resultados na pilha e retorne a quantidade. Registre-as individualmente com lua_pushcfunction ou em conjunto com luaL_newlib.
Perguntas Frequentes
A aula “Registrando funções C no Lua” é grátis?
Sim — o texto completo de “Registrando funções C no Lua” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.
O que vou aprender em “Registrando funções C no Lua”?
Exponha funções C a scripts Lua usando luaL_register e lua_pushcfunction. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Lua Academy?
Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Registrando funções C no Lua”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Lua Academy?
Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Modelo de pilha da API C do Lua
- Chamando funções Lua a partir de C
- Registrando funções C no Lua
- Gerenciamento de estado e tratamento de erros