@compileLog

@compileLog

컴파일 타임에 실행되는 코드가 중간에 뭘 들고 다니는지 궁금할 때가 있어요. 그럴 때 쓰는 게 @compileLog예요 — 런타임의 print처럼, 컴파일 타임의 값을 그 자리에서 출력해 주는 내장 함수죠.

출처: Zig Documentation

본문

@compileLog(...) void

이 함수는 컴파일 타임에 넘겨받은 인자들을 출력해요.

실수로 코드에 컴파일 로그 문장을 남겨두는 걸 막기 위해서, 빌드에는 그 로그 문장을 가리키는 컴파일 에러가 추가돼요. 이 에러가 코드 생성을 막지만, 분석 자체를 방해하지는 않아요.

즉 이 함수는 컴파일 타임에 실행되는 코드를 대상으로 "printf 디버깅"을 할 때 쓰면 돼요.

아래 예시를 직접 돌려볼게요. num1을 정하는 블록 안에서 @compileLogval1 값을 출력하고, test "main" 안에서도 한 번 더 호출해요.

const print = @import("std").debug.print;

const num1 = blk: {
    var val1: i32 = 99;
    @compileLog("comptime val1 = ", val1);
    val1 = val1 + 1;
    break :blk val1;
};

test "main" {
    @compileLog("comptime in main");

    print("Runtime in main, num1 = {}.\n", .{num1});
}

실행하면 @compileLog가 있는 두 자리에 컴파일 에러가 뜨면서, 각 위치에서 출력된 컴파일 로그가 함께 보여요.

$ zig test test_compileLog_builtin.zig
/home/ci/work/zig-bootstrap/zig/doc/langref/test_compileLog_builtin.zig:5:5: error: found compile log statement
    @compileLog("comptime val1 = ", val1);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/ci/work/zig-bootstrap/zig/doc/langref/test_compileLog_builtin.zig:11:5: note: also here
    @compileLog("comptime in main");
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
referenced by:
    test.main: /home/ci/work/zig-bootstrap/zig/doc/langref/test_compileLog_builtin.zig:13:46

Compile Log Output:
@as(*const [16:0]u8, "comptime val1 = "), @as(i32, 99)
@as(*const [16:0]u8, "comptime in main")

컴파일 로그는 build가 아니라 분석 차원에서 처리되기 때문에, 디버깅을 마쳤으면 이 문장들을 지워야 해요. 남겨두면 계속 컴파일 에러로 잡히니까요.

더 알아보기

  • @compileError — 컴파일 타임에 의도적으로 에러를 발생시키는 내장 함수
  • @compileLog — 원문 문서 보기