Perguntas de Entrevista sobre Interoperabilidade C em Zig
A interoperabilidade com C é um dos pilares de Zig. A capacidade de importar headers C, chamar funções C sem overhead e linkar com bibliotecas C existentes torna Zig uma escolha prática para migração gradual de codebases C e integração com o vasto ecossistema de bibliotecas C existentes. Entrevistadores testam esse conhecimento especialmente quando a empresa possui código legado em C.
Fundamentos
Como importar e usar uma biblioteca C em Zig?
Zig pode importar headers C diretamente com @cImport:
const c = @cImport({
@cInclude("stdio.h");
@cInclude("stdlib.h");
});
pub fn main() void {
_ = c.printf("Hello from C!\n");
const ptr = c.malloc(100);
if (ptr) |p| {
c.free(p);
}
}
O compilador Zig traduz os tipos C para tipos Zig automaticamente.
Qual a diferença entre @cImport e usar o Zig build system para C?
@cImport traduz headers em tempo de compilação. O build system permite compilar arquivos .c junto com Zig, linkar bibliotecas estáticas/dinâmicas e gerenciar flags de compilação. Em projetos reais, ambos são usados juntos — veja build system.
Como os tipos C são mapeados para Zig?
| Tipo C | Tipo Zig |
|---|---|
int | c_int |
char* | [*c]u8 |
void* | ?*anyopaque |
size_t | usize |
NULL | null |
struct X | Struct Zig equivalente |
Ponteiros C ([*c]T) permitem aritmética de ponteiros e podem ser nulos, diferente de ponteiros Zig regulares.
Como chamar Zig a partir de C?
Exporte funções Zig com export:
export fn somar(a: c_int, b: c_int) c_int {
return a + b;
}
A função fica disponível para linkagem com código C usando o nome somar.
Perguntas Avançadas
Quais são os desafios comuns de interop C/Zig?
- Gerenciamento de memória misto: Código C usa malloc/free, código Zig usa allocators. É essencial manter consistência sobre quem aloca e quem libera.
- Strings: Strings C são null-terminated (
[*:0]const u8), slices Zig não são. Usestd.mem.spanpara converter. - Error handling: C usa códigos de retorno, Zig usa error unions. Wrappers devem traduzir entre os dois.
- Callbacks: Function pointers C podem não ser compatíveis diretamente com closures Zig (que capturam contexto).
Descreva uma estratégia de migração gradual de C para Zig.
- Comece linkando o código C existente com o build system Zig
- Escreva testes para módulos C existentes usando
std.testingde Zig - Migre módulos isolados um por um, começando pelos menores
- Use
@cImportpara que o novo código Zig chame o C restante - Exporte funções Zig para que o código C possa chamar Zig
- Gradualmente substitua até o código inteiro ser Zig
Essa abordagem é usada por empresas como Uber e Cloudflare. Veja também transição de C para Zig.
Complemente com perguntas de build system e explore o ecossistema de bibliotecas. Pratique com tutoriais e projetos que integram C e Zig.