Chamando funções C via FFI
Invoque funções da libc e de bibliotecas compartilhadas personalizadas a partir do Lua sem sobrecarga.
Chamando funções C via FFI é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 2 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.
Chamadas diretas a funções C
Depois de declaradas com ffi.cdef, as funções C são chamadas exatamente como funções Lua por meio do objeto da biblioteca. Os argumentos e valores de retorno são convertidos automaticamente.
local ffi = require("ffi")
ffi.cdef[[ double sin(double x); ]]
local m = ffi.load("m")
print(m.sin(math.pi / 2)) -- 1.0Conversão de tipos
Por padrão, os números Lua se tornam valores C double. A FFI converte automaticamente para o tipo do parâmetro C declarado. Booleanos se tornam 0/1. Strings se tornam const char*.
Chamando printf
printf é uma função C variádica. Chame-a por meio de ffi.C.printf com strings de formato e argumentos.
ffi.cdef[[ int printf(const char *fmt, ...); ]]
ffi.C.printf("Sum: %d\n", 42)Tratamento de valores de retorno
Os valores de retorno C são convertidos automaticamente para tipos Lua. Inteiros se tornam números Lua, e char* se torna lightuserdata (use ffi.string para converter).
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) converte um ponteiro char* em uma string Lua. Sem len, a leitura continua até um byte nulo.
Tratamento de erros
As funções C retornam códigos de erro ou definem errno. Verifique explicitamente os valores de retorno. Acesse errno por meio de 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 estruturas
Passe estruturas C por valor ou por ponteiro. Crie-as com 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 ponteiro
Passe ponteiros de saída para funções que retornam vários valores por meio de parâmetros de ponteiro.
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])Desempenho das chamadas FFI
As chamadas FFI para funções C têm sobrecarga quase nula — são muito mais rápidas do que chamadas de Lua para C pela API C tradicional. Muitas vezes, o JIT consegue embutir a chamada por completo.
Funções variádicas
Funções C variádicas (...) devem ser chamadas com os tipos corretos. Passe conversões explícitas de tipo, se necessário, para evitar ambiguidades.
ffi.C.printf("%d %f\n", ffi.cast("int", 42), ffi.cast("double", 3.14))Práticas de segurança
Sempre verifique se os valores de retorno de ponteiros são NULL. Nunca passe um ponteiro liberado ou fora do escopo. Use ffi.gc para associar finalizadores a alocações C.
Pergunta sobre chamadas FFI
Como a FFI converte uma string Lua em um const char* C?
Recapitulação: chamando C pela FFI
Chame funções C pelo objeto da biblioteca, assim como chamaria funções Lua. A FFI cuida da conversão de tipos. Use ffi.string para retornos char*, ffi.errno() para erros e ffi.new para argumentos de estruturas e matrizes.
Perguntas Frequentes
A aula “Chamando funções C via FFI” é grátis?
Sim — o texto completo de “Chamando funções C via FFI” é 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 “Chamando funções C via FFI”?
Invoque funções da libc e de bibliotecas compartilhadas personalizadas a partir do Lua sem sobrecarga. 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 2 de 4.
Quanto tempo leva a aula “Chamando funções C via FFI”?
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
- Noções básicas de FFI: ffi.cdef e ffi.load
- Chamando funções C via FFI
- Ponteiros, estruturas e matrizes em FFI
- Retornos de chamada: passando funções Lua para C