c++ - 为什么需要前向声明?

标签 c++ c compiler-construction declaration

Possible Duplicate:
Should C++ eliminate header files?

在 C# 和 Java 等语言中,无需在使用之前声明(例如)类。如果我理解正确,这是因为编译器对代码进行了两次传递。第一个它只是“收集可用的信息”,第二个它检查代码是否正确。

在 C 和 C++ 中,编译器只执行一次传递,因此此时所有内容都需要可用。

所以我的问题基本上是为什么在 C 和 C++ 中不这样做。是不是就不需要头文件了?

最佳答案

简短的回答是,从定义 C 的时间到 25 年后出现 Java 的时间之间,计算能力和资源呈指数级增长。

更长的答案...

编译单元的最大尺寸——编译器在单个 block 中处理的代码块——将受到编译计算机的内存量的限制。为了处理您键入机器代码的符号,编译器需要将所有符号保存在一个查找表中,并在代码中遇到它们时引用它们。

当 C 语言于 1972 年创建时,计算资源更加稀缺且价格昂贵 - 一次存储复杂程序的整个符号表所需的内存在大多数系统中根本不可用。固定存储也很昂贵,而且速度极慢,因此像虚拟内存或将部分符号表存储在磁盘上这样的想法根本不允许在合理的时间范围内进行编译。

该问题的最佳解决方案是通过让人工提前在哪些编译单元中对符号表的哪些部分进行分类,将代码分成更小的部分。向程序员强加一个相当小的任务来声明他使用什么,从而节省了让计算机在整个程序中搜索程序员可以使用的任何东西的巨大努力。

它还使编译器不必对每个源文件进行两次传递:第一次对其中的所有符号进行索引,第二次对引用进行解析并查找它们。当您处理磁带时,查找时间以秒为单位,读取吞吐量以每秒字节数(不是千字节或兆字节)为单位,这非常有意义。

C++ 是在将近 17 年后创建的,它被定义为 C 的超集,因此必须使用相同的机制。

到 1995 年 Java 出现时,普通计算机已经拥有足够的内存来保存符号表,即使对于一个复杂的项目,也不再是一个沉重的负担。而且 Java 的设计初衷并不是为了向后兼容 C,所以它不需要采用遗留机制。 C# 也同样不受阻碍。

因此,他们的设计者选择将划分符号声明的负担从程序员身上转移到计算机上,因为它的成本与编译的总工作量成正比。

关于c++ - 为什么需要前向声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2632601/

相关文章:

c++ - 如何配置在 CLion 中构建项目的方式?

c++ - 缺少运算符 << 但它在那里

c - 为什么recvfrom在UDP消息上存储0.0.0.0的IP地址?

c - 我的 for 循环添加了 +1 多余的内容,我不知道为什么

c++ - 警告 C4247 和 C4248 是什么意思?为什么它们从 Visual C++ 2005 中删除?

c++ - 位图数据乱码显示

c++ - CPP 中没有构造函数错误的实例

c - 查找默认未包含的 C 库

c# - 来自泛型类中事件订阅代码的奇怪反编译代​​码

c# - 编译器错误取决于方法签名中的参数位置。使用未分配的局部变量