C에 있는 구조물의 전진 선언?
#include <stdio.h>
struct context;
struct funcptrs{
void (*func0)(context *ctx);
void (*func1)(void);
};
struct context{
funcptrs fps;
};
void func1 (void) { printf( "1\n" ); }
void func0 (context *ctx) { printf( "0\n" ); }
void getContext(context *con){
con=?; // please fill this with a dummy example so that I can get this working. Thanks.
}
int main(int argc, char *argv[]){
funcptrs funcs = { func0, func1 };
context *c;
getContext(c);
c->fps.func0(c);
getchar();
return 0;
}
여기 뭔가 빠진 게 있어요.이것 고치는 것 좀 도와주세요.고마워요.
구조체(typedef 없음)는 키워드 structure와 함께 사용해야 하는 경우가 많습니다.
struct A; // forward declaration
void function( struct A *a ); // using the 'incomplete' type only as pointer
structure를 입력한 경우 struct 키워드를 생략할 수 있습니다.
typedef struct A A; // forward declaration *and* typedef
void function( A *a );
구조 이름을 재사용하는 것은 합법입니다.
코드 내에서 포워드 선언을 다음과 같이 변경해 보십시오.
typedef struct context context;
구조 이름과 유형 이름을 나타내는 접미사를 추가하는 것이 더 읽기 쉬울 수 있습니다.
typedef struct context_s context_t;
이거 드셔보세요
#include <stdio.h>
struct context;
struct funcptrs{
void (*func0)(struct context *ctx);
void (*func1)(void);
};
struct context{
struct funcptrs fps;
};
void func1 (void) { printf( "1\n" ); }
void func0 (struct context *ctx) { printf( "0\n" ); }
void getContext(struct context *con){
con->fps.func0 = func0;
con->fps.func1 = func1;
}
int main(int argc, char *argv[]){
struct context c;
c.fps.func0 = func0;
c.fps.func1 = func1;
getContext(&c);
c.fps.func0(&c);
getchar();
return 0;
}
#include <stdio.h>
struct b; // not needed because:
struct a {
struct b * pb; //this member definition also forward declares struct b
int c;
};
typedef struct a a // needed for a but not struct a because:
struct b {
struct a* pa; //this member definition also forward declares struct a
a * pa1;
void * c;
};
int main() {
printf("Hello, world!");
return 0;
}
기본적으로 신고는 전달하지 않아도 됩니다.struct b그 자체로는 순수 선언을 실행하기 위해 부분 타입을 사용할 때 항상 회선 자체에 부분 타입을 선언하기 때문에 이것은 용장 코드입니다.이런 유형의 순방향 선언의 유일한 장점은 typedef와 함께 사용할 수 있다는 것입니다.C++에서는 structure와 typedef가 같은 식별자 네임스페이스에 있기 때문에 typedef가 필요하지 않습니다.struct b이 시점에서 선언하기 때문에 도움이 됩니다.bC++ 로 표시됩니다.
요점은 선언이 아닌 사실상 잠정적인 정의인 것을 선언하기 전에 해당 유형이 완료되지 않은 경우입니다(따라서).struct e f없이 파일/블록 범위 내에서extern)는 포인터가 아닙니다.또는 포인터가 포인터인 경우 참조를 해제하려고 하면 불완전한 유형 오류가 발생합니다.
즉, 불완전한 타입을 사용할 수 있도록 하는 것입니다.이것은 별개의 액션이 아니기 때문에, 전진 선언은 잊어 주세요.그것은 노선의 일부입니다.struct g* htypedef 이외에는 실제로는 필요한 정방향 선언을 사용할 필요가 없습니다.그것은, 독자적인 행에 정방향 선언 부분이 있기 때문입니다.
불완전한 유형을 사용할 수 있으면 유형을 사용하기 전에 나중에 완료할 수 있습니다.일반적으로 포워드 선언의 장점은 타입에 대한 포인터를 사용할 때 C++에 완전한 정의를 포함하는 헤더를 포함할 필요가 없고 다음 작업만 수행하면 된다는 것입니다.class bar그리고 나서.bar *, 또는 단순히 사용하시는 것만으로class bar*없이.class bar회선(이 특정 멤버가 사용되지 않는 경우).
크기가 불완전한 유형을 구조체 멤버로 사용할 수 없습니다(이러한 코드까지 크기를 알 수 없는 경우). 구조체가 변수를 선언/정의하는 데 사용되지 않는 경우에도 마찬가지입니다.구조가 타입이기 때문에, 1회 밖에 할 수 없는 타입의 완전한 정의를 제공할 때는, 불완전한(크기를 알 수 없는 멤버가 있는) 것이 아니라, 완전한 사이즈로 할 필요가 있기 때문에, 타입을 사용할 수 없게 된다고 생각합니다.불완전한 구조를 포함하는 이 구조는 참조되지 않습니다.한편, 불완전한 크기의 불완전한 유형을 참조할 수 있습니다.또한 불완전한 유형의 포인터를 참조할 수는 있지만 참조할 수는 없습니다(주소는 참조할 수 없기 때문에 참조할 수는 없습니다).전체 크기불완전한 타입의 메모리가 불완전한 사이즈를 수반하지 않는 한 참조할 수 있습니다. extern struct i j file file/block scope를 할 수 있습니다./block scope가 한 필요하지 않기 때문입니다.j는 코드로 참조되고 있으며, 이 시간까지 타입이 완료되어야 합니다.
언급URL : https://stackoverflow.com/questions/9999512/forward-declaration-of-a-struct-in-c
'itsource' 카테고리의 다른 글
| C++를 배우기 전에 C를 배워야 하나요? (0) | 2022.08.16 |
|---|---|
| Linux에서 (C 및 C++) 바이너리 기호를 표시하려면 어떻게 해야 합니까? (0) | 2022.08.16 |
| Spring CrudRepository 검색 기준InventoryIds(List inventoryIdList) - IN 절에 해당합니다. (0) | 2022.08.16 |
| vue2-google-module 사용자 지정 스타일 (0) | 2022.08.16 |
| 뷰 Vuex 부품 때 스토어의 변화하지 않습니다. (0) | 2022.08.16 |