문제

포인터와 관련하여 C의 전방 참조는 무엇입니까?

예를 들어 볼 수 있습니까?

도움이 되었습니까?

해결책

이 페이지를 참조하십시오 전진 참조. 포인터와 다른 포드 유형과 앞으로의 참조가 어떻게 다른지 알 수 없습니다.

선언 유형을 전달하고 해당 유형의 포인터 인 변수를 선언 할 수 있습니다.

struct MyStruct;
struct MyStruct *ptr;
struct MyStruct var;  // ILLEGAL
ptr->member;  // ILLEGAL

struct MyStruct {
    // ...
};

// Or:

typedef struct MyStruct MyStruct;
MyStruct *ptr;
MyStruct var;  // ILLEGAL
ptr->member;  // ILLEGAL

struct MyStruct {
    // ...
};

나는 이것이 포인터와 선언 선언을 다룰 때 당신이 요구하는 것이라고 생각합니다.

다른 팁

포인터와 관련하여 "전진 참조"는 다음과 같은 것을 의미한다고 생각합니다.

struct MyStruct *ptr; // this is a forward reference.

struct MyStruct
{
  struct MyStruct *next; // another forward reference - this is much more useful
  // some data members
};

포인터는 가리키는 구조가 정의되기 전에 선언됩니다.

포인터가 주소를 저장하기 때문에 컴파일러는이 문제를 해결할 수 있으며 포인터의 메모리를 예약하기 위해 그 주소에 무엇이 있는지 알 필요가 없습니다.

전진 참조는 유형을 선언하지만 정의하지 않을 때입니다.

포인터 (또는 C ++ 참조)별로 유형을 사용할 수 있지만 변수를 선언 할 수는 없습니다.

이것은 무언가가 존재한다고 컴파일러에게 말하는 방법입니다.

PLOP 구조가 정의되어 있다고 가정하십시오 plop.h:

struct Plop
{
   int n;
   float f;
};

이제 해당 구조물과 함께 작동하는 유틸리티 기능을 추가하려고합니다. 다른 파일을 만듭니다 ploputils.h (plop.h를 변경할 수 없다고 가정 해 봅시다.) :

struct Plop; // Instead of including Plop.h, just use a forward declaration to speed up compile time

void doSomething(Plop* plop);
void doNothing(Plop* plop);

이제 해당 기능을 구현할 때는 구조 정의가 필요하므로 PLOP.H 파일을 포함시켜야합니다. ploputils.cpp:

#include "PlopUtils.h"
#include "Plop.h" // now we need to include the header in order to work with the type

void doSomething(Plop* plop)
{
   plop->n ...
}

void doNothing(Plop* plop);
{
   plop->f ...
}

C 컴파일러는 원래 기호 테이블 빌딩과 시맨틱 분석을 수행 한 패스를 가지고 있다고 생각합니다. 예를 들어 :

    ....
    ... foo(a,b) + 1 ... // assumes foo returns int
    ....

    double foo(double x, double y){ ... } // violates earlier assumption

이를 방지하기 위해 다음과 같이 말합니다.

    double foo(double x, double y); // this is the forward declaration

    ....
    ... foo(a,b) + 1 ... // correct assumptions made
    ....

    double foo(double x, double y){ ... } // this is the real declaration

파스칼은 같은 개념을 가졌다.

이전 답변에 추가. 전방 참조가 필수 인 일반적인 상황은 구조물 Foo에 구조대에 대한 포인터가 포함되어 있고 막대에는 Foo에 대한 포인터 (선언 사이의 원형 의존성)가 포함되어 있습니다. C 에서이 상황을 표현하는 유일한 방법은 즉, 선언문을 사용하는 것입니다.

struct foo;

struct bar
{
   struct foo *f;
};

struct foo
{
   struct bar *b;
};

전방 참조를 사용하면 C 컴파일러가 패스를 적게 수행하고 컴파일 시간을 크게 줄일 수 있습니다. 약 20 년 전에 컴퓨터가 훨씬 느려지고 호박이 덜 효율적일 때 중요했을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top