1. 불완전 타입
말그대로 타입에 정보가 완전하지 않는 선언을 예기한다.
예를 들어보자.
typedef struct _st_tag uncomplete_type ;
struct {
int i ;
uncomplete_type* uc ;
} hmm ;
여기서 uncomplete_type이 바로 불완전 타입이다. struct형은 내부에 멤버를 선언하게 된다.
하지만 여기에서는 그 내용을 알수없게 되어 있다. 따라서 불완전형은 그대로 정의할수 없고 포인터를 이용해서 정의한다.
불완전형은 정의할수 없지만 불완형의 포인터는 완전한 형이다.
2. 불완전형의 포인터는 완전한형?
-. 불완전형이라 해도 그 타입에 포인터는 항상 정의됨으로 완전형이다.
-. 더 구체적으로 만약 포인터형이 4바이트인 머신인경우 불완전형에 포인터 역시 의심에 여지없지 4바이트일것이다.
-. 즉 불완전형은 그대로 정의할 수 있다.
3. 사용
그럼 대체 이넘은 어느경우에 사용되는가? 각각의 헤더에서 서로 참조하는 경우를 생각해보자
역시 코드로 보자
a.h b.h
struct tag_b ; struct tag_a ;
typedef struct tag_a { typedef struct tag_b {
int i ; int i ;
struct tag_b* b ; struct tag_a* a ;
} type_a ; } type_b ;
이렇게 다른 헤더에서 서로에 타입을 참조하는경우 #include 로는 해결이 안된다
이런 경우 불완전 타입을 이용해서 간단히 해결할 수 있다.
forward declaration이라고 하는것은 말그대로 전방선언? 한마디로 나중에 형이 완성되는 불완전형을 선언할때를 나타내는 말이다.
EOF