use*_*421 19 c c++ compiler-construction declaration
可能重复:
C++应该删除头文件吗?
在像C#和Java这样的语言中,没有必要在使用它之前声明(例如)一个类.如果我理解正确,这是因为编译器对代码进行了两次传递.在第一个中它只是"收集可用信息",在第二个中它检查代码是否正确.
在C和C++中,编译器只进行一次传递,因此当时所有东西都需要可用.
所以我的问题基本上就是为什么不用C和C++这样做.它不会消除头文件的需求吗?
Dan*_*ory 42
简短的回答是计算能力和资源在定义C的时间和Java在25年后出现的时间之间呈指数级增长.
答案越长......
编译单元的最大大小- 编译器在单个块中处理的代码块 - 将受编译计算机具有的内存量的限制.为了处理您在机器代码中键入的符号,编译器需要将所有符号保存在查找表中,并在代码中遇到它们时引用它们.
当C在1972年创建时,计算资源更加稀缺且高昂 - 在大多数系统中都无法立即存储复杂程序的整个符号表所需的内存.固定存储也很昂贵,并且非常慢,因此虚拟内存或在磁盘上存储符号表部分等想法根本不允许在合理的时间范围内进行编译.
解决这个问题的最佳方法是将代码分成更小的部分,方法是在需要时将符号表的哪些部分放在哪个编译单元中.向程序员强加一个相当小的任务来宣告他将使用什么节省了计算机搜索整个程序以获得程序员可以使用的任何东西的巨大努力.
它还使编译器不必在每个源文件上进行两次传递:第一个用于索引内部的所有符号,第二个用于解析引用并查找它们.当你处理磁带时,在几秒钟内测量搜索时间,读取吞吐量以每秒字节数(不是千字节或兆字节)来衡量,这非常有意义.
C++虽然在大约17年后创建,但被定义为C的超集,因此必须使用相同的机制.
当Java在1995年推出时,平均计算机有足够的内存,即使对于复杂的项目,持有符号表也不再是一个沉重的负担.Java并不是为了与C语言向后兼容而设计的,因此它不需要采用传统机制.C#同样没有受到阻碍.
结果,他们的设计师选择将符号声明的划分负担从程序员身上移开并再次放在计算机上,因为它的成本与编译的总工作量成比例是最小的.
结论:编译器技术已经取得了进展,无需进行前向声明.加上计算机的速度要快几千倍,因此可以进行必要的额外计算以处理缺少前向声明的问题.
C和C++较旧,在需要保存每个CPU周期时都是标准化的.