/* 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;
};
您能解释一下前向声明背后的原因吗?
我注意到没有人真正回答你提出的问题,这是
前向声明类型的原因是什么?
答案是:C 被设计为可以编译通过读取每个文件once从上到下。考虑像 C# 这样的语言:
class C
{
B b;
}
class B
{
C c;
}
请注意,如果编译器从上到下,编译器会到达类型字段B
在它知道什么之前B
是。事实上 C# 编译器确实not读取整个文件once从上到下。它使many遍历每个文件,同时构建信息。
现在假设您想编写一个可以解析上面程序的 C# 编译器without进行多次传递。以某种方式你必须告诉编译器在遇到场之前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;
}
就这样吧。当编译器到达B b
它知道B
是一个稍后定义的类。B
已经前瞻性声明.
由于 C# 始终使用多遍方法,因此不需要此技巧。但C的设计者did想要单遍方法,因此他们需要前向声明的冗余。
这种单遍方法的设计初衷是为了让编译变得更容易,当时机器只有几 K 内存并且每秒运行几千个周期。相比之下,C# 多次扫描每次构建复杂数据结构的方法成本高昂,并且在速度和内存有限的机器上会很困难。
当然,现在我们拥有拥有数万亿字节内存的机器(记住,memory is 磁盘空间; RAM 只是磁盘上的缓存!)每秒运行数十亿个周期,但我们仍然不得不使用技术来使编译器编写者的生活在 20 世纪 70 年代变得更轻松。当你使用 C 时,情况就是这样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)