expected ';' — Como Resolver em Zig

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/else usados como statements
  • Blocos while e for usados 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:

  1. Declarações const e var: const x = 5;
  2. Atribuições: x = 10;
  3. Chamadas de função como statement: foo();
  4. return: return valor;
  5. break e continue: break;, continue;
  6. defer e errdefer: defer allocator.free(ptr);
  7. _ = expressão: _ = resultado;

Não coloque ; após:

  1. Fechamento de bloco } (quando é bloco de controle)
  2. Declarações de função (após o })
  3. Entre if e else

Dicas

  1. Configure seu editor — O ZLS (Zig Language Server) mostra erros de ; em tempo real.
  2. Zig format — Execute zig fmt no seu código. Embora não adicione ; faltantes, o formatador ajuda a manter a consistência.
  3. Leia a linha indicada — O compilador aponta a linha exata onde o ; era esperado.

Erros Relacionados

Continue aprendendo Zig

Explore mais tutoriais e artigos em português para dominar a linguagem Zig.