0Pricing
Lua Academy · Lección

Registro de funciones C en Lua

Exponga funciones C a scripts de Lua mediante luaL_register y lua_pushcfunction.

Registro de funciones C en Lua es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

Descripción general

Las funciones de C pueden exponerse a los scripts de Lua. Deben tener la signatura int myFunc(lua_State *L). Leen los argumentos de la pila e introducen los valores devueltos.

Signatura de una función de C

Toda función que se pueda llamar desde Lua es una lua_CFunction: recibe un lua_State*, lee los argumentos, introduce los resultados y devuelve el número 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
}

Registrar como global

lua_pushcfunction(L, l_add) introduce la función de C y, después, lua_setglobal(L, "add") la registra como global en Lua.

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

luaL_newlib / luaL_register

Registre un conjunto de funciones de C como módulo de Lua mediante un array de luaL_Reg y 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)

Leer argumentos

luaL_checknumber(L, n), luaL_checkstring(L, n), etc., leen y validan los argumentos, y generan un error de Lua si el tipo es incorrecto.

Devolver varios valores

Introduzca varios valores y devuelva su cantidad. Lua los asignará como múltiples valores devueltos.

// 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 de C

Los closures de C capturan upvalues en el momento del registro mediante lua_pushcclosure(L, fn, n). Acceda a los upvalues con lua_upvalueindex(n).

Informar de errores desde C

Llame a luaL_error(L, format, ...) para generar un error de Lua desde una función de C. Nunca devuelve el control: realiza un longjmp hasta el manejador de la llamada protegida.

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

Módulo de C como .so/.dll

Un módulo de C expone una función luaopen_modname. El require de Lua carga la biblioteca compartida y la llama para inicializar el módulo.

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

Comprobar el número de argumentos

Use lua_gettop(L) para comprobar el número de argumentos pasados. luaL_checkany(L, n) garantiza que se hayan proporcionado al menos n argumentos.

Alternativa FFI de LuaJIT

La FFI de LuaJIT permite llamar directamente a funciones de C desde Lua sin escribir código envoltorio en C. Suele ser más sencilla para llamadas a funciones puras. La API de C es necesaria para una integración más profunda.

Pregunta sobre funciones de C

¿Qué debe devolver una función de C que se pueda llamar desde Lua?

Repaso: registrar funciones de C

Las funciones de C que se pueden llamar desde Lua tienen la signatura int f(lua_State*). Lea los argumentos con luaL_check*, introduzca los resultados y devuelva la cantidad. Regístrelas individualmente con lua_pushcfunction o en bloque con luaL_newlib.

Preguntas frecuentes

¿La lección «Registro de funciones C en Lua» es gratis?

Sí — el texto completo de «Registro de funciones C en Lua» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Registro de funciones C en Lua»?

Exponga funciones C a scripts de Lua mediante luaL_register y lua_pushcfunction. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Registro de funciones C en Lua»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Modelo de pila de la API C de Lua
  2. Llamada a funciones de Lua desde C
  3. Registro de funciones C en Lua
  4. Gestión del estado y los errores
← Volver a Lua Academy