@export 내장 함수
@export 내장 함수
@export는 Zig가 빌드한 결과물(오브젝트 파일)에 심볼(symbol)을 노출시켜 주는 강력한 내장 함수예요. 쉽게 말해, 다른 언어나 라이브러리에서 부를 수 있도록 함수나 변수를 "밖으로 내보내는" 역할을 해요. 때로는 함수 앞에 export 키워드를 붙이는 것과 같은 일을 하는데, @export는 그걸 더 유연하게, 조건부로 조절하고 싶을 때 써요.
@export(comptime ptr: *const anyopaque, comptime options: std.lang.ExportOptions) void
본문
@export는 오브젝트 파일에 심볼을 만들어서, 그 심볼이 ptr이 가리키는 대상을 참조하게 해요. ptr은 전역 변수(global variable)나 컴파일 타임에 값이 정해지는 상수(comptime-known constant)를 가리켜야 해요.
이 내장 함수는 comptime 블록 안에서 호출해 조건에 따라 심볼을 내보낼 수도 있어요. 특히 ptr이 C 호출 규약(calling convention)을 쓰는 함수를 가리키고, options.linkage가 .strong이라면, 함수에 export 키워드를 붙인 것과 정확히 같은 동작을 해요.
comptime {
@export(&internalName, .{ .name = "foo", .linkage = .strong });
}
fn internalName() callconv(.c) void {}
$ zig build-obj export_builtin.zig
위 코드는 아래처럼 함수에 export 키워드를 붙인 것과 동일해요.
export fn foo() void {}
$ zig build-obj export_builtin_equivalent_code.zig
export를 쓸 때도 심볼의 이름을 내 마음대로 정하고 싶다면, 식별자(identifiers) 문법의 @"foo" 형태를 사용하면 어떤 문자열이든 심볼 이름으로 쓸 수 있어요.
export fn @"A function name that is a complete sentence."() void {}
$ zig build-obj export_any_symbol_name.zig
결과 오브젝트를 살펴보면, 심볼이 말 그대로(verbatim) 그대로 사용된 걸 확인할 수 있어요.
00000000000001f0 T A function name that is a complete sentence.
더 알아보기
심볼을 내보내는 일은 주로 C 라이브러리를 만들 때 중요해져요. 함수 몇 개를 Zig 바깥 세계에 공개하는 전체 흐름이 궁금하다면 아래 주제를 함께 보면 좋아요.
- Exporting a C Library — C 라이브러리를 만들 때 심볼을 내보내는 방법