2011-12-09 3 views
1

구조체 정의가있는 두 개의 파일이 있습니다. 헤더 :extern 변수 및 다른 소스 파일에 정의 된 구조체

typedef struct _InputData InputData; 
extern InputData input_data; 

및 소스 파일 :

struct _InputData{ 
    char const*modification_l; 
    char const*amount_l; 
    char const*units_l; 
}; 
InputData input_data = {...}; 

내가 다른 소스 파일에서 input_data 사용하려고 그것은 나 "불완전한 형식 정의 'InputData'의 잘못된 사용을"제공합니다. 왜 그런 일이 일어 났는지 이해할 수 있다고 생각하지만, 내가 어떻게하면 가장 우아하게 처리 할 수 ​​있는지 생각해 봅니다.

답변

2

헤더 파일에 전체 구조를 정의했습니다. 그렇지 않으면 어떤 필드가 있는지, 즉 불완전한 필드를 알 수있는 방법이 없습니다.

+0

또는 더 나은 , 헤더에서만 정의한 다음 헤더를 소스 파일에 포함 시키십시오. –

+0

@BlagovestBuyukliev 아, 그게 무슨 뜻인지 ... 대답이 업데이트되었습니다. –

0

다른 곳에서 정의 된 struct에 대한 포인터를 사용할 수 있지만 인스턴스는 사용할 수 없습니다. 컴파일러는 구조가 무엇인지 알지 못하며 그러한 변수에 대한 메모리 오프셋을 계산하는 방법을 알지 못합니다.

struct 정의를 C 파일에 넣는 이유는 무엇입니까? 그것을 헤더에 넣으십시오.

+0

나는 시도했지만 그것은 "dereferencing 불완전 유형에 대한 포인터"라고 말했다. – Yola

+0

@Yola, 네, 역 참조 할 때 구조체 정의가 여전히 알려지지 않았다면 - 컴파일러는 여전히 오프셋을 계산하는 방법을 모른다. 당신이 한 일은 C++ 클래스의 private 타입과 같이 선언 할 때 사용되며, 외부 사용자가 어떻게 만들어 졌는지 알기를 원하지 않는다면 가리 키기 만하면됩니다. 당신이 역 참조를한다면 ** ** 정의를 포함시켜야합니다. – littleadv

1

당신은이 방법을 (다소) 할 수 있지만 대신 포인터와 구조체 정의해야

헤더를

extern struct InputData* input_data; 

소스 파일 :

struct InputData{ 
    char const*modification_l; 
    char const*amount_l; 
    char const*units_l; 
}; 

InputData* input_data; 
... 
input_data = malloc(sizeof(InputData)); 
관련 문제