使用前声明的历史原因,包括和头/源拆分.需要找到合适的参考资料

Historical reason for declaration before use, include and header/source split. Need to find suitable reference

本文关键字:拆分 参考资料 历史 声明 包括      更新时间:2023-10-16

TLDR:请参阅此问题的最后一段。

我是一名计算机科学专业的学生,正在努力完成我的硕士论文中关于创建一个transiler的文本(案例研究(。

现在,对于这篇硕士论文,我的一部分内容是关于比较所涉及的语言。其中一种语言是C++。

现在,我试图解释导入/包含语义的差异,以及C++这样做的历史原因。我知道它在C/C++中是如何工作的,所以我真的不需要技术解释。

通过对谷歌和Stackoverflow的广泛研究,我提出了几个关于这个主题的Stackoverlow解释和其他参考文献:

为什么需要远期申报?

C++中的正向声明是什么?

为什么C++需要一个单独的头文件?

http://en.wikipedia.org/wiki/Include_directive

http://www.cplusplus.com/forum/articles/10627/

https://softwareengineering.stackexchange.com/questions/180904/are-header-files-actually-good

http://en.wikipedia.org/wiki/One-pass_compiler

为什么C++中有头文件和.cpp文件?

最后但并非最不重要的是Bjarne Stroustrup的书"C++的设计与进化(1994("(第34-35页(。

如果我理解正确的话,这种导入/包含的方式来自C,并且是因为以下原因:

  • 计算机没有那么快,所以一次通过编译器更可取。唯一可行的方法是在使用习语之前强制声明。这是因为C和C++是具有上下文敏感语法的编程语言:它们需要在符号表中定义正确的符号,以消除某些规则的歧义。这与现代编译器相反:如今,通常首先构建符号表,有时(在语言具有上下文无关语法的情况下(在解析阶段不需要符号表,因为没有歧义需要解决。

  • 在那些日子里,记忆是非常有限和昂贵的。因此,在大多数计算机中,将整个符号表存储在内存中是不可行的。这就是为什么C允许程序员向前声明他们实际需要的函数原型和全局变量。创建头是为了使开发人员能够集中这些声明,以便在需要这些符号的模块之间轻松重用。

  • 头文件是从实现中抽象接口的一种有用方法

  • C++试图与用C编写的软件和软件库建立向后兼容性。更重要的是:他们实际上曾将代码转换为C(CFront(,然后使用C编译器将代码编译成机器代码。这也使他们能够从一开始就编译到许多不同的平台,因为每个平台都已经有了C编译器和C链接器。

以上是我通过首先搜索发现的内容的说明;(问题是:除了Stackoverflow之外,我找不到合适的参考资料来说明这种包含策略的历史原因。我非常怀疑我的大学会对stackoverflow链接感到高兴。我最接近的是"C++的设计和进化"参考,但它没有提到硬件限制是包含策略的原因。我认为这是意料之中的,因为该功能的设计来自C。问题是,我还没有找到任何好的来源来描述C中的设计决策,最好考虑到硬件限制。

有人能给我指个好方向吗?

谢谢!

您说得对,C++这样做的原因是C是这样做的。C这样做的原因也是基于在历史上;在一开始(B(,没有声明。如果您编写了f(),则编译器假定CCD_ 2是某个地方的函数。它返回了一个词,因为B中的所有内容都是一个单词;没有类型。当C发明的(添加类型,因为一切都是一个词(不是很有效的字节寻址机器(,基本原理没有改变,只是假设函数返回int(并接受您给它的类型的参数(。如果没有返回int,则必须用转发声明返回类型。在C的早期不使用include的应用程序在使用的每个源文件中重新声明,例如char* malloc()malloc。开发预处理器是为了避免多次重新键入相同的内容,并且在一开始,其最重要的特征可能是CCD_ 8。(在早期C,<ctype.h>中的所有功能,以及基于字符的IO在<stdio.h>中是宏。(

至于为什么声明需要优先使用:原因无疑是因为如果不这样做,编译器会假设一个隐式声明(函数返回int等(。当时,编译器通常是一次性的,至少对于解析;人们认为它太复杂了,无法回头看"纠正"已经作出的假设。

当然,在C++中,该语言不受这C++总是要求声明函数,例如例如,在某些上下文中(在类成员函数中,例如示例(,不需要在使用之前声明。(不过,一般来说,我会考虑班级成员的职能是一个错误的特征,为了可读性的原因而避免。这个函数定义必须在Java是不大量使用该语言的主要原因项目。(