질문의 역사:
C 언어에서는 한 구조체가 다른 구조체에 대해 "알고 있어야" 할 경우가 있지만 두 구조체의 정의가 서로 의존하는 경우(상호 중첩)도 있습니다. 이 경우 두 번째 구조체를 선언하기 전에 하나의 구조체를 완전히 정의하는 것이 불가능합니다. 이를 위해 C에서는 구조체의 전방 선언(forward declaration)을 제공합니다.
문제:
전방 선언이 없으면 컴파일러는 구조체 내부에 어떤 유형이 포함되어 있는지 알지 못하여 알 수 없는 유형에 대한 오류를 발생시킵니다. 다른 구조체를 값으로 포함하려고 할 때, 포인터가 아닌 경우에 자주 오류가 발생하거나 문법을 잘못 작성하는 경우가 많습니다.
해결책:
전방 선언은 구조체의 전체 정의를 공개하지 않고 구조체에 대한 포인터를 생성해야 할 때 사용됩니다. 문법은 struct A;입니다. 전체 정의(struct A { ... };)는 나중에 제공할 수 있습니다.
코드 예시:
struct B; // 전방 선언 struct A { int val; struct B *link; }; struct B { int id; struct A *parent; };
주요 특징:
전방 선언을 통해 "다른 구조체의 값" 유형 필드를 만들 수 있습니까?
아니요, 전방 선언은 오직 포인터 형태로만 유형을 사용할 수 있으며, 그렇지 않으면 오류가 발생합니다: 유형의 크기를 알 수 없기 때문입니다.
struct B; // 괜찮음 struct A { struct B b; // 오류: B의 크기가 알 수 없음 };
다른 파일에서 작업할 때 전방 선언을 올바르게 배치하는 위치는 어디입니까?
전방 선언은 구조체가 포인터로만 사용되는 경우 헤더에 배치합니다. 전체 정의는 다른 헤더나 구현 파일에서 제공해야 합니다.
전방 선언이 구조체의 크기와 메모리 할당의 적절성에 영향을 미칩니까?
아니요, C는 "정의되지 않은" 구조체의 크기를 알지 못하며, 포인터는 선언된 유형에 관계없이 동일한 크기를 가집니다.
헤더 파일에서 두 모듈 모두 서로의 필드를 값으로 포함한 구조체를 포함하고 있었습니다. 컴파일이 미정의 유형 오류로 실패했습니다.
장점:
단점:
프로그래머 중 한 명이 전방 선언과 포인터를 사용하여 헤더의 중복 의존성을 최소화했습니다. 코드의 컴파일 및 유지 관리가 더 쉬워졌습니다.
장점:
단점: