2015-02-07 1 views
1

나는 C에서 녹슨 것이지만, typedef을 사용하여 적절한 사용법을 이해하고, 구현 파일에서 실제 구조체의 구조를 정의하고, 그런 다음 세 번째 파일에서 구조체를 사용합니다. qnode_t는 큐의 구현 파일 내에서 사용되는 구조체가typedef struct in header와 dereference 포인터가 불완전한 타입으로

typedef struct queue 
{ 
    int count; 
    qnode_t *head; 
    qnode_t *tail; 
} queue_t; 

:

나는 같은 정의 된 유형을 가진 큐 데이터 구조를 썼다. 내 헤더 내에서

나는이 있습니다

typedef struct queue queue_t; 

이 같은 큐의 길이를 얻기 위해 시도하고있어 다른 파일 내에서이 queue_t 유형을 사용 : 그 라인에

queue_t *work_queue; 
... 
int length = work_queue->count; 

그러나 어디에서 카운트를 찾고 있는데 컴파일러 오류가 발생합니까?

dereferencing pointer to incomplete type

C에서 타입을 적절히 정의하는 방법에 대한 많은 연구를 해왔지만 많은 예제가 다른 리소스와 충돌하거나 너무 단순 해 실제 사용에 옮겨지기 때문에 명확성 대신 점점 더 혼란스러워하고 있다고 생각합니다. .

구조체 내의 '개수'변수가 정의되어 있지 않기 때문에이 오류가 발생합니까? 이 경우, 다음 구현 및 헤더 구조체를 모두 정의 할 수 있습니까? 그렇다면 헤더는 머리 & 꼬리가 숨겨 지거나/개인이어야하므로 정의 된 카운트 변수 만 가질 수 있습니까? (나는 OOP가 그리워) queue_t*을 취하고 그 길이를 size_t으로 돌려주는 또 다른 함수를 만들어야할까요?

+1

오류 메시지를 SO로 검색하면 이전 질문 목록을 많이 볼 수 있습니다.많은 실수로 인해 발생할 수 있습니다. 어떤 실수를했는지 확실하지 않습니다. 이 질문을 읽으면 오류를 해결하는 단어를 찾을 것입니다. – Barmar

+0

@Barmar 나는 그 중 몇 가지를 읽었지 만 불행히도 내가 잘못한 것을 정확히 파악하지 못했기 때문에 내 자신의 글을 올린 이유에 대해 많은 후속/추가 질문을했습니다. – JNYRanger

답변

1

선언 된 형식이 아닌 정의 된 형식 만 역 참조 할 수 있습니다. 형식 선언은 불투명 한 포인터를 입력 확인하는 데 유용하지만 개체 필드는 표시되지 않으며 액세스 할 수 없습니다. 큐 객체의 필드에 액세스하려면 typedef를 머리글 으로 이동해야합니다.

편집 : 질문에서/아래 답변 :

예, 두 개의 동일한 구조체 정의가 동일한 형식 정의로 볼 수 있습니다. 동일한 소스 파일에 두 가지 정의가 전혀없는 경우 필드를 생략 할 수 있지만 그렇게하지 않으면 버그와 유지 관리 혼란을 초래할 수 있습니다. 밑줄로 시작하는 이름이 내부적 인 이름 지정 규칙을 사용하는 것이 더 좋습니다.

규칙은 헤더에 구조체를 정의한 다음 구현 파일에 동일한 헤더를 포함시키는 것입니다. 이는 게시 된 레이아웃을 구현과 동기화 된 상태로 유지합니다.

+0

필자는 그 느낌이 들었지 만 본인의 원래 질문에 게시 된 것처럼 몇 가지 후속 조치가 있습니다. "구현 및 헤더에서 구조체를 정의 할 수 있습니까? 그렇다면 헤더에 head & tail이 숨겨 지거나/private되어야하기 때문에 정의 된 count 변수? " – JNYRanger

+0

예, 두 개의 동일한 구조체 정의가 동일한 typedef로 간주됩니다. 같은 소스 파일에 두 가지 정의가 없다면 필드를 생략 할 수 있지만 그렇게하지 않으면 버그와 유지 관리 혼란을 초래할 수 있습니다. 밑줄로 시작하는 이름이 내부적 인 이름 지정 규칙을 사용하는 것이 더 좋습니다. – Andras

+0

규칙은 헤더에 구조체를 정의한 다음 구현 파일에 동일한 헤더를 포함시키는 것입니다. 이렇게하면 게시 된 레이아웃이 구현과 동기화 된 상태로 유지됩니다. – Andras

0

컴파일러가 가리키는 유형에 대한 완전한 정보에 액세스 할 수있는 경우가 아니면 포인터를 역 참조 할 수 없습니다. struct 포인터의 경우, 완전한 struct 정의가 필요하다는 것을 의미합니다.

불완전한 타입에 대해 불평하는 코드를 컴파일 할 때 컴파일러는 포인터의 typedef가 아닌 struct 유형의 전체 정의를 볼 수 있어야합니다.

관련 문제