itsource

C에 있는 구조물의 전진 선언?

mycopycode 2022. 8. 16. 23:37
반응형

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

반응형