번역 실패
번역 실패 (Translation failures)
C의 어떤 구성은 Zig로 그대로 옮길 수 없어요. 예를 들어 goto, 비트필드를 가진 struct, 토큰을 붙이는 매크로 같은 건 번역이 안 되죠. 그럴 때 Zig는 **demotion(강등)**이라는 방식을 써서 번역을 계속 이어가요.
본문
demotion에는 세 가지 종류가 있어요. opaque, extern, 그리고 @compileError가 그것이죠.
올바르게 번역할 수 없는 C의 struct·union은 opaque{}로 번역돼요. opaque 타입을 담고 있거나 번역 불가능한 코드 구성을 갖고 있는 함수는 extern 선언으로 강등되고요. 덕분에 번역할 수 없는 타입도 포인터로는 쓸 수 있고, 번역할 수 없는 함수도 링커가 그 컴파일된 함수를 알고만 있다면 호출이 가능해져요.
@compileError는 최상위 정의(전역 변수, 함수 프로토타입, 매크로)를 번역하거나 강등할 수 없을 때 쓰여요. Zig는 최상위 선언에 대해 지연 분석(lazy analysis)을 하기 때문에, 번역 불가능한 요소는 실제로 코드에서 사용하지 않는 한 컴파일 에러를 내지 않아요.