@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
- Logging estruturado: Incluir arquivo e linha nas mensagens de log automaticamente.
- Assertions personalizados: Mensagens de erro que indicam exatamente onde a falha ocorreu.
- Profiling: Rastrear entradas e saídas de funções.
- Debug: Identificar o ponto exato de execução durante debugging.
Builtins relacionados
- @compileLog — Imprime valores em tempo de compilação
- @compileError — Gera erro com mensagem em comptime
- @panic — Encerra execução com mensagem
- @typeName — Nome de tipo para logging