@compileLog
@compileLog
컴파일 타임에 실행되는 코드가 중간에 뭘 들고 다니는지 궁금할 때가 있어요. 그럴 때 쓰는 게 @compileLog예요 — 런타임의 print처럼, 컴파일 타임의 값을 그 자리에서 출력해 주는 내장 함수죠.
본문
@compileLog(...) void
이 함수는 컴파일 타임에 넘겨받은 인자들을 출력해요.
실수로 코드에 컴파일 로그 문장을 남겨두는 걸 막기 위해서, 빌드에는 그 로그 문장을 가리키는 컴파일 에러가 추가돼요. 이 에러가 코드 생성을 막지만, 분석 자체를 방해하지는 않아요.
즉 이 함수는 컴파일 타임에 실행되는 코드를 대상으로 "printf 디버깅"을 할 때 쓰면 돼요.
아래 예시를 직접 돌려볼게요. num1을 정하는 블록 안에서 @compileLog로 val1 값을 출력하고, 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 — 원문 문서 보기