forward declaration 과 불완전타입

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

+ Recent posts