expected ‘;’ — Como Resolver em Zig
O Que Este Erro Significa
O erro expected ';' indica que o compilador Zig encontrou o fim de uma declaração ou expressão, mas não encontrou o ponto e vírgula (;) que deveria terminá-la. Em Zig, a maioria das declarações e atribuições deve terminar com ;, de forma similar a C e Rust.
A mensagem de erro aponta exatamente para o local onde o ; era esperado.
Causas Comuns
1. Esquecer o Ponto e Vírgula Após Declaração
pub fn main() void {
const x = 42 // ERRO: expected ';' após '42'
_ = x;
}
2. Esquecer o Ponto e Vírgula Após Chamada de Função
const std = @import("std");
pub fn main() void {
std.debug.print("olá\n", .{}) // ERRO: expected ';'
}
3. Esquecer Após Atribuição
pub fn main() void {
var x: u32 = 0;
x = 42 // ERRO: expected ';'
_ = x;
}
4. Esquecer Após return
fn soma(a: i32, b: i32) i32 {
return a + b // ERRO: expected ';'
}
5. Confundir com Linguagens que Não Usam ;
Programadores vindos de Python, Go, Kotlin ou Swift frequentemente esquecem o ;:
pub fn main() void {
const nome = "Zig" // ERRO: em Zig, ; é obrigatório
const versao = "0.13" // ERRO
_ = nome;
_ = versao;
}
6. Ponto e Vírgula Após Bloco de Controle (Desnecessário)
Curiosamente, o erro oposto também existe — colocar ; onde não deveria:
pub fn main() void {
const x: u32 = 5;
if (x > 3) {
// ...
}; // Isso pode ou não ser um erro, dependendo do contexto
}
Em Zig, blocos if, while, for e switch geralmente não precisam de ; quando usados como statements. Mas quando usados como expressões atribuídas, seguem as regras normais.
7. Usar ; Dentro de Expressão Inline
pub fn main() void {
// Incorreto: ; no meio da expressão
const x = if (true) 1; else 2; // ERRO
_ = x;
}
Como Corrigir
Solução 1: Adicionar o Ponto e Vírgula
Na maioria dos casos, basta adicionar o ;:
pub fn main() void {
const x = 42; // Correto
_ = x;
}
Solução 2: Após Chamadas de Função
const std = @import("std");
pub fn main() void {
std.debug.print("olá\n", .{}); // Correto
}
Solução 3: Após return
fn soma(a: i32, b: i32) i32 {
return a + b; // Correto
}
Solução 4: Entender Onde ; NÃO Deve Ir
Em Zig, você não coloca ; após:
- Blocos
if/elseusados como statements - Blocos
whileeforusados como statements - Declarações de funções (após a
}) - Declarações de structs/enums (após a
})
const std = @import("std");
// Sem ; após declaração de função
fn exemplo() void {
// Sem ; após if/else como statement
if (true) {
std.debug.print("sim\n", .{});
} else {
std.debug.print("não\n", .{});
}
// Sem ; após for como statement
const arr = [_]u32{ 1, 2, 3 };
for (arr) |item| {
_ = item;
}
}
// Sem ; após declaração de struct
const Ponto = struct {
x: f64,
y: f64,
}; // MAS: ; aqui porque é uma declaração const
Solução 5: Expressões if/else em Linha
Quando if é usado como expressão, o ; vai no final:
pub fn main() void {
const x: u32 = 5;
const resultado = if (x > 3) @as(u32, 1) else @as(u32, 0); // ; no final
_ = resultado;
}
Regra Geral
Em Zig, coloque ; após:
- Declarações
constevar:const x = 5; - Atribuições:
x = 10; - Chamadas de função como statement:
foo(); return:return valor;breakecontinue:break;,continue;defereerrdefer:defer allocator.free(ptr);_ = expressão:_ = resultado;
Não coloque ; após:
- Fechamento de bloco
}(quando é bloco de controle) - Declarações de função (após o
}) - Entre
ifeelse
Dicas
- Configure seu editor — O ZLS (Zig Language Server) mostra erros de
;em tempo real. - Zig format — Execute
zig fmtno seu código. Embora não adicione;faltantes, o formatador ajuda a manter a consistência. - Leia a linha indicada — O compilador aponta a linha exata onde o
;era esperado.
Erros Relacionados
- expected expression — Quando uma expressão completa é esperada
- expected ‘}’ — Quando falta chave de fechamento
- expected block expression — Quando um bloco é esperado