2016-10-24 4 views
0

구조체를 정의 할 때 struct를 사용할 수 있지만 선언 할 때 함수 나 구조체를 어떻게 선언 할 수 있습니까? 당신이이 없으면extern struct를 어떻게 선언합니까?

test.h

extern struct foo; 
typedef int (*test)(FOO *f); 
typedef struct foo 
{ 
char a; 
test *t; 
} FOO; 

int haha(FOO *f) { return 0;} 

typedef struct foo 
{ 
char a; 
test *t; 
} FOO; 

TEST.C는

int main() {FOO e; return 0; } 
+0

포인터 문제뿐만 아니라 'extern'에 관해 특별히 질문했습니다. extern struct가 무엇을 의미합니까? 달성하고자하는 것은 무엇입니까? 이 컴파일 단위는 구조체의 내용을 사용해야하는 경우 완전한 정의가 필요합니다. 구조체의 extern 인스턴스를 의미 했습니까? 내 구조체에 – Rup

+0

난 함수 또는 구조체 foo 포인터가 필요합니다. 함수 또는 구조체 foo 매개 변수 또는 구성원 prev 구조체 있습니다. 문제는 struct dependence를 함께 선언하는 방법입니다. 변수가 아닙니다. –

+0

좋아, 그래서 아래의 답변을 당신이 원하는 것입니다 : 포인터를 구조체 대신 임베디드 구조체 멤버 선언해야합니까. 함수 포인터는 그냥 잘 작동합니다. – Rup

답변

3

문제는 당신이 (다른 구조 내부 또는 회원) 구조 변수를 정의 할 수 없다는 것입니다 실제 구조의 완전한 정의. 전달 선언은 완전한 정의가 아닙니다. forward 선언문을 가지고 있다면 선언 할 수있는 모든 것은 구조체에 대한 포인터입니다. 당신이 할 수있는 모든 것을 의미

가 전체 구조를 필요로하지 않는다,

typedef struct bar BAR; // Forward declaration of the structure and type-alias definition in one line 
typedef struct foo FOO; // Forward declaration of the structure and type-alias definition in one line 

struct foo { 
    char a; 
    BAR *b; // Define a *pointer* to the BAR structure 
    FOO *s; // Define a *pointer* to the FOO structure 
}; 
구조에 대한 포인터를 선언 할 수 있기 때문에이 작동

같은 것이, 컴파일러는 구조가 존재한다는 것을 알고있다이다 정의. 이를 위해 정상적인 선언이 필요합니다.

또한 구조체를 재귀 적으로 참조 할 때는 닫는 중괄호까지 전체 정의가 완료되지 않았으므로 포인터도 필요합니다.

+0

struct ** bar **가 ** foo ** –

+1

@MarkoLustro에 의존하기 때문에이 코드를 컴파일하지 마십시오. 정상적으로 작동합니다. * 포인터 *를 정의하는 것은 그림과 같이 앞으로 선언 만 필요합니다. –

+0

@MarkoLustro 또한 구조체 모음 내부의'struct foo'를 포인터로 만들고 싶습니다. 그러나 그렇게하지 않더라도 기존의 정의는 위의 대체 foo 정의로 컴파일해야합니다. 그 시점에서 foo의 크기. – Rup

관련 문제