转发声明一种类型 - 这背后的原因是什么

Len*_*Bru 3 c

/* Forward declare a type "point" to be a struct. */
typedef struct point point;
/* Declare the struct with integer members x, y */
struct point {
   int    x;
   int    y;
};
Run Code Online (Sandbox Code Playgroud)

你能解释一下前方宣布的原因吗?

Eri*_*ert 11

我注意到没有人真正回答过你提出的问题

前向声明类型的原因是什么?

答案是:C的设计使得它可以被编译通过读取每个文件一次去从上到下.考虑像C#这样的语言:

class C
{
  B b;
}
class B
{
  C c;
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果编译器从上到下,编译器会B在知道内容之前进入类型字段B.而事实上,C#编译器并没有将整个文件读一次会从顶部到底部.它会对每个文件进行多次传递,并随着时间的推移构建信息.

现在假设您想编写一个C#编译器,它可以解析上面的程序而不需要多次传递.不知何故,你必须在它遇到字段之前b告诉编译器有一个叫做的类型B.但我们不能只是class B之前移动,class C因为这会再次产生同样的问题,这一次C!

在我们想象中的一次性C#版本中你可能会说你可以解决这个问题:

class B; // Tell the compiler that B will be defined later.
class C
{
  B b;
}
class B
{
  C c;
}
Run Code Online (Sandbox Code Playgroud)

你去吧 当编译器到达B b它时,它知道这B是一个稍后将定义的类.B已经向前宣布.

由于C#总是使用多遍方法,因此不需要这个技巧.但是C的设计者确实需要单通道方法,因此它们需要前向声明的冗余.

这种单程方法旨在使机器具有几K内存并以每秒几千个周期运行的那一天更容易编译; 相比之下,C#的多次扫描方法每次构建复杂的数据结构都很昂贵,并且在速度和内存受限的机器上很难实现.

当然,我们当然拥有数万亿字节内存的机器(记住,内存磁盘空间 ; RAM只是磁盘上的缓存!),每秒运行数十亿次循环,但我们仍然不得不使用技术来制作编者在20世纪70年代的生活更加轻松.这就是你使用C时的情况.