6

ポインタに関するCの前方参照とは何ですか?

私は例を得ることができますか?

4

6 に答える 6

11

前方参照については、このページを参照してください。ポインターと他の PoD タイプで前方参照がどのように異なるのかわかりません。

型を宣言し、その型へのポインターである変数を宣言できることに注意してください。

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 {
    // ...
};

これは、ポインターと前方宣言を扱うときに求めているものだと思います。

于 2008-11-28T16:54:27.760 に答える
9

ポインタに関する「前方参照」は、次のような意味だと思います。

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

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

ポインタは、それが指す構造が定義される前に宣言されます。

ポインタがアドレスを格納するため、コンパイラはこれを回避できます。ポインタ用のメモリを予約するために、そのアドレスに何があるかを知る必要はありません。

于 2008-11-28T17:22:23.040 に答える
5

前方参照とは、型を宣言するが定義しない場合です。

ポインタによる型(またはC ++の参照)を使用できますが、変数を宣言することはできません。

これは、コンパイラに何かが存在することを伝える方法です。

Plop.hで定義されたPlop構造があるとします。

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);

これらの関数を実装するときは、構造体の定義が必要になるため、PlopUtils.cppにPlop.hファイルをインクルードする必要があります

#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 ...
}
于 2008-11-28T17:45:49.437 に答える
3

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

パスカルも同じコンセプトでした。

于 2008-11-28T20:36:58.403 に答える
3

以前の回答に追加します。前方参照が必須となる典型的な状況は、struct foo に struct bar へのポインターが含まれ、bar に foo へのポインターが含まれている場合です (宣言間の循環依存)。C でこの状況を表現する唯一の方法は、前方宣言を使用することです。

struct foo;

struct bar
{
   struct foo *f;
};

struct foo
{
   struct bar *b;
};
于 2008-11-29T01:19:40.550 に答える
-5

Forward references allow C compiler to do less passes and significantly reduces compilation time. It is probably was important some 20 years ago when computers was much slower and compliers less efficient.

于 2008-11-28T18:03:44.767 に答える