0Pricing
Lua Academy · Aula

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.0

Conversã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))
end

ffi.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())
end

Argumentos 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

  1. Noções básicas de FFI: ffi.cdef e ffi.load
  2. Chamando funções C via FFI
  3. Ponteiros, estruturas e matrizes em FFI
  4. Retornos de chamada: passando funções Lua para C
← Voltar para Lua Academy