@src em Zig — Referência e Exemplos

@src em Zig

O @src retorna uma struct com informações sobre a localização no código-fonte onde ele é invocado — incluindo o nome do arquivo, número da linha e coluna. Útil para logging, debug e mensagens de erro que precisam indicar de onde foram chamados.

Sintaxe

@src() std.builtin.SourceLocation

Parâmetros

Nenhum.

Valor de retorno

Retorna uma struct std.builtin.SourceLocation com os campos:

  • file ([:0]const u8): Caminho do arquivo-fonte
  • line (u32): Número da linha
  • column (u32): Número da coluna
  • fn_name ([:0]const u8): Nome da função onde @src() é invocado

Exemplos práticos

Exemplo 1: Logging com localização

const std = @import("std");

fn log(comptime nivel: []const u8, mensagem: []const u8, loc: std.builtin.SourceLocation) void {
    std.debug.print("[{s}] {s}:{d} ({s}): {s}\n", .{
        nivel,
        loc.file,
        loc.line,
        loc.fn_name,
        mensagem,
    });
}

fn processar() void {
    log("INFO", "Iniciando processamento", @src());
    // [INFO] src/main.zig:15 (processar): Iniciando processamento

    log("WARN", "Dados incompletos", @src());
}

pub fn main() void {
    log("INFO", "Programa iniciado", @src());
    processar();
}

Exemplo 2: Assert personalizado com localização

const std = @import("std");

fn meuAssert(ok: bool, mensagem: []const u8, loc: std.builtin.SourceLocation) void {
    if (!ok) {
        std.debug.print("ASSERTION FAILED em {s}:{d} ({s}): {s}\n", .{
            loc.file,
            loc.line,
            loc.fn_name,
            mensagem,
        });
        @panic("Assertion failed");
    }
}

pub fn main() void {
    const x: u32 = 42;
    meuAssert(x > 0, "x deve ser positivo", @src());
    meuAssert(x < 100, "x deve ser menor que 100", @src());
}

Exemplo 3: Rastreamento de chamadas

const std = @import("std");

const Tracer = struct {
    pub fn entrar(loc: std.builtin.SourceLocation) void {
        std.debug.print("--> {s} ({s}:{d})\n", .{ loc.fn_name, loc.file, loc.line });
    }

    pub fn sair(loc: std.builtin.SourceLocation) void {
        std.debug.print("<-- {s}\n", .{loc.fn_name});
    }
};

fn calcular() u32 {
    Tracer.entrar(@src());
    defer Tracer.sair(@src());

    return 42;
}

pub fn main() void {
    Tracer.entrar(@src());
    defer Tracer.sair(@src());

    const resultado = calcular();
    std.debug.print("Resultado: {}\n", .{resultado});
}

Casos de uso comuns

  1. Logging estruturado: Incluir arquivo e linha nas mensagens de log automaticamente.
  2. Assertions personalizados: Mensagens de erro que indicam exatamente onde a falha ocorreu.
  3. Profiling: Rastrear entradas e saídas de funções.
  4. Debug: Identificar o ponto exato de execução durante debugging.

Builtins relacionados

Tutoriais relacionados

Continue aprendendo Zig

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