gpt4 book ai didi

c - 前向声明一个类型——这背后的原因是什么

转载 作者:太空狗 更新时间:2023-10-29 15:45:03 27 4
gpt4 key购买 nike

/* 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;
};

你能解释一下前向声明背后的原因吗?

最佳答案

我注意到没有人真正回答你问的问题,这是

What is the reason for forward-declaring a type?

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

class C
{
B b;
}
class B
{
C c;
}

请注意,如果编译器是从上到下,编译器会在知道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;
}

好了。当编译器到达 B b 时,它知道 B 是稍后将定义的类。 B 已被转发声明

由于 C# 一直使用多 channel 方法,因此不需要此技巧。但是 C 语言的设计者确实想要一种单遍方法,因此他们需要前向声明的冗余。

在机器只有几 K 内存并以每秒几千个周期运行的时代,这种单遍方法旨在使编译更容易;相比之下,C# 的多次扫描每次构建复杂数据结构的方法代价高昂,并且在速度和内存受限的机器上会很困难。

当然,现在我们的机器拥有数万亿字节的内存(记住,内存磁盘空间;RAM 只是磁盘上的缓存!)运行数十亿每秒循环数,但在 70 年代,我们仍然不得不使用技术让编译器编写者的生活更轻松。当你使用 C 时就是这样。

关于c - 前向声明一个类型——这背后的原因是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23568612/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com