구조체 이름 붙이기

구조체 이름 붙이기 (Struct Naming)

Zig의 구조체는 전부 익명(anonymous)으로 선언돼요. 그런데 앞에서 @typeName으로 이름을 찍어 보면 실제로는 어떤 이름이 붙어 나오죠. 정답은 “Zig가 몇 가지 규칙에 따라 타입 이름을 알아서 지어준다”예요. 이 절에서는 그 규칙을 하나씩 짚어 볼게요.

출처: Zig Documentation

본문

모든 구조체가 익명이기 때문에, Zig는 다음 규칙에 따라 타입 이름을 추론해요.

  • 구조체가 변수의 초기화 표현식에 있다면, 그 변수 이름을 따서 이름을 지어요.
  • 구조체가 return 표현식에 있다면, 반환하는 함수 이름을 따르는데, 이때 매개변수 값도 함께 직렬화돼요.
  • 그 외의 경우에는 (filename.funcname__struct_ID) 같은 형태의 이름을 붙여요.
  • 구조체가 다른 구조체 안에 선언됐다면, 부모 구조체 이름과 위 규칙으로 추론된 이름을 점(.)으로 연결해 이름을 지어요.

구체적으로 어떤 이름이 나오는지 @typeName으로 직접 확인해 볼게요.

const std = @import("std");

pub fn main() void {
    const Foo = struct {};
    std.debug.print("variable: {s}\n", .{@typeName(Foo)});
    std.debug.print("anonymous: {s}\n", .{@typeName(struct {})});
    std.debug.print("function: {s}\n", .{@typeName(List(i32))});
}

fn List(comptime T: type) type {
    return struct {
        x: T,
    };
}
$ zig build-exe struct_name.zig
$ ./struct_name
variable: struct_name.main.Foo
anonymous: struct_name.main__struct_783
function: struct_name.List(i32)

출력이 규칙과 그대로 맞아떨어지는 걸 볼 수 있어요. const Foo = struct {};처럼 변수의 초기화 표현식에 쓰인 struct는 변수 이름을 따서 struct_name.main.Foo가 되고요. 이름 없이 바로 만든 익명 구조체는 struct_name.main__struct_783처럼 __struct_ID 꼴의 자동 생성 이름을 받아요. 마지막으로 List(i32)처럼 함수에서 반환하는 구조체는 함수 이름과 인자 값이 그대로 이름이 돼요. 각 구조체가 어디에서 태어났는지만 알면 이름이 어떻게 나올지 예측할 수 있답니다.

더 알아보기