什么是C中的前向参考?

时间:2008-11-28 16:52:09

标签: c pointers forward-reference

C中关于指针的前向引用是什么?

我可以举一个例子吗?

6 个答案:

答案 0 :(得分:11)

forward references上查看此页面。我不知道前向引用如何与指针和其他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 {
    // ...
};

我认为这是你在处理指针和前瞻声明时所要求的。

答案 1 :(得分:8)

我认为关于指针的“前向引用”意味着这样的事情:

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

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

指针在它指向的结构被定义之前被声明。

编译器可以避免这种情况,因为指针存储了一个地址,你不需要知道该地址是什么来为指针保留内存。

答案 2 :(得分: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 ...
}

答案 3 :(得分: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
帕斯卡具有相同的概念。

答案 4 :(得分:2)

添加到之前的答案。前向引用是强制性的典型情况是struct foo包含指向结构栏的指针,而bar包含指向foo的指针(声明之间的循环依赖)。在C中表达这种情况的唯一方法是使用前向声明,即:

struct foo;

struct bar
{
   struct foo *f;
};

struct foo
{
   struct bar *b;
};

答案 5 :(得分:-5)

前向引用允许C编译器执行更少的传递并显着减少编译时间。大约20年前,当计算机速度慢得多且编制效率低下时,这可能很重要。