Llamada a funciones C mediante FFI
Invoque funciones de libc y de bibliotecas compartidas personalizadas desde Lua sin sobrecoste.
Llamada a funciones C mediante FFI es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 2 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.
Llamadas directas a funciones de C
Una vez declaradas con ffi.cdef, las funciones de C se llaman exactamente igual que las funciones de Lua a través del objeto de biblioteca. Los argumentos y valores devueltos se convierten automáticamente.
local ffi = require("ffi")
ffi.cdef[[ double sin(double x); ]]
local m = ffi.load("m")
print(m.sin(math.pi / 2)) -- 1.0Conversión de tipos
Los números de Lua se convierten en valores double de C de forma predeterminada. FFI realiza automáticamente la conversión al tipo del parámetro de C declarado. Los valores booleanos se convierten en 0/1. Las cadenas se convierten en const char*.
Llamar a printf
printf es una función variádica de C. Llámela mediante ffi.C.printf con cadenas de formato y argumentos.
ffi.cdef[[ int printf(const char *fmt, ...); ]]
ffi.C.printf("Sum: %d\n", 42)Gestión de valores devueltos
Los valores devueltos por C se convierten automáticamente en tipos de Lua. Los enteros se convierten en números de Lua y los valores char* en lightuserdata (use ffi.string para convertirlos).
ffi.cdef[[ char *getenv(const char *name); ]]
local ptr = ffi.C.getenv("HOME")
if ptr ~= nil then
print(ffi.string(ptr))
endffi.string
ffi.string(ptr, len) convierte un puntero char* en una cadena de Lua. Sin len, lee hasta un byte nulo.
Gestión de errores
Las funciones de C devuelven códigos de error o establecen errno. Compruebe explícitamente los valores devueltos. Acceda a errno mediante ffi.errno().
ffi.cdef[[ int open(const char *path, int flags); ]]
local fd = ffi.C.open("missing.txt", 0)
if fd < 0 then
print("Error:", ffi.errno())
endArgumentos de tipo struct
Pase las estructuras de C por valor o mediante un puntero. Créelas con ffi.new.
ffi.cdef[[
typedef struct { int x, y; } Point;
void printPoint(Point p);
]]
local p = ffi.new("Point", {x=3, y=4})
lib.printPoint(p)Argumentos de tipo puntero
Pase punteros de salida a las funciones que devuelven varios valores mediante parámetros de tipo puntero.
ffi.cdef[[
void minmax(double *arr, int n, double *min, double *max);
]]
local arr = ffi.new("double[5]", {5,2,8,1,9})
local mn, mx = ffi.new("double[1]"), ffi.new("double[1]")
lib.minmax(arr, 5, mn, mx)
print(mn[0], mx[0])Rendimiento de las llamadas FFI
Las llamadas FFI a funciones de C tienen una sobrecarga casi nula, por lo que son mucho más rápidas que las llamadas de Lua a C mediante la API de C tradicional. A menudo, el JIT puede insertar la llamada por completo.
Funciones variádicas
Las funciones variádicas de C (...) deben llamarse con los tipos correctos. Si es necesario, pase conversiones de tipo explícitas para evitar ambigüedades.
ffi.C.printf("%d %f\n", ffi.cast("int", 42), ffi.cast("double", 3.14))Prácticas de seguridad
Compruebe siempre que los valores devueltos de tipo puntero no sean NULL. Nunca pase un puntero liberado o fuera de ámbito. Use ffi.gc para asociar finalizadores a las asignaciones de C.
Pregunta sobre las llamadas FFI
¿Cómo gestiona FFI la conversión de una cadena de Lua a un const char* de C?
Resumen: llamar a C mediante FFI
Llame a las funciones de C a través del objeto de biblioteca, igual que a las funciones de Lua. FFI se encarga de la conversión de tipos. Use ffi.string para los valores char* devueltos, ffi.errno() para los errores y ffi.new para los argumentos de tipo struct o array.
Preguntas frecuentes
¿La lección «Llamada a funciones C mediante FFI» es gratis?
Sí — el texto completo de «Llamada a funciones C mediante FFI» 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 «Llamada a funciones C mediante FFI»?
Invoque funciones de libc y de bibliotecas compartidas personalizadas desde Lua sin sobrecoste. 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 2 de 4.
¿Cuánto tiempo toma la lección «Llamada a funciones C mediante FFI»?
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
- Conceptos básicos de FFI: ffi.cdef y ffi.load
- Llamada a funciones C mediante FFI
- Punteros, structs y arrays en FFI
- Callbacks: pasar funciones de Lua a C