2014-06-09 61 views
1

TLDR:请参阅此问题的最后一段。使用前声明的历史原因,包括和标题/来源拆分。需要找到合适的参考

我是一名计算机科学专业的学生,​​试图完成关于创建转译器(案例研究)的我的硕士论文的文本。

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

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

在谷歌和广泛#1研究,我想出了几种解释计算器和其他参考有关此主题:

Why are forward declarations necessary?

What are forward declarations in C++?

Why does C++ need a separate header file?

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

Why have header files and .cpp files in C++?

最后但并非最不重要了Bjarne Stroustrup的(第34页 - 35)的书 “设计和C演化++(1994年)”。

如果我理解正确的话做进口这种方式/包括由C来了,来是因为以下几个原因:

  • 电脑是没有那么快,所以一个合格的编译器是可取的。唯一可行的方法是在使用惯用语之前强制执行声明。这是因为C和C++是具有上下文敏感语法的编程语言:它们需要在符号表中定义正确的符号才能消除某些规则的歧义。这与现代编译器相反:现在第一遍通常用于构造符号表,有时(如果语言具有上下文无关语法),在解析阶段不需要符号表,因为不存在歧义。

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

  • 头文件是抽象接口一种有用的方式从实施

  • C++试图建立与软件并写入C.更重要softwarelibraries向后兼容性:它们实际上用于transpile到C(CFRONT),然后使用C编译器将代码编译为机器码。这也使他们能够从一开始就编译到很多不同的平台,因为每个平台都有一个C编译器和C链接器。

上面是什么,我先搜索发现了一个说明;)的问题是:我不能从这里#2找到一个合适的引用此包括战略的历史原因,一边。我非常怀疑我的大学会很满意一个计算器链接。我最接近的是“C++的设计和发展”参考,但没有提到硬件限制是包含策略的一个原因。我认为这是可以预料的,因为这个特性的设计来自C.问题是我没有找到任何好的源代码,但是用C来描述这个设计决策,最好考虑硬件限制。

任何人都可以指出我的好方向吗?

谢谢!

+1

您的第一个链接清楚地解释了它。至于找到参考,我不知道你是否能找到一个适当的参考,为每一个在20世纪70年代初作出的决定......但祝你好运:) –

+0

我知道,这是我的大部分解释来自;)但我怀疑我的大学会接受这个参考。这就是我问的原因。但是,无论如何谢谢回答;)我真的希望我仍然可以找到一个。 –

回答

2

你说得对,C++这样做的原因是因为 C这样做。 C这样做的原因也是基于历史上的 ;在开始(B)时,没有 声明。如果你写了f(),那么编译器假设 f是某处的函数。哪一个返回了一个单词,因为 B中的所有内容都是一个单词;没有类型。当发现C为 (为了增加类型,因为一切字都不是很有效,所以字节寻址的机器效率不高),基本原理 没有改变,除了函数被假定返回 int(并且取你给它的类型的参数)。如果它 没有返回int,那么你必须转发声明与 返回类型。在C的前几天,看到不使用include的应用程序的 并不罕见,并且仅重新声明了例如 。 char* malloc()在每个源文件中使用了 malloc。预处理器的开发是为了避免必须多次重复输入相同的东西,并且最初的 其最重要的功能可能是#define。 (在早期的C, 所有的功能<ctype.h>,以及基于IO 在<stdio.h>字符是宏)

至于为什么需要声明preceed使用:主要 原因是毫无疑问,因为如果没如果编译器 假定有一个隐式声明(函数返回int等)。 而在当时,编译器一般都是一次通过,至少对于 的解析;人们认为回到 “已经修正”了一个已经做出的假设太复杂了。

当然,在C++中,语言不会受到 这个约束; C++一直要求声明函数,例如 示例,并且在某些上下文中(在类成员函数中,对于 示例),不要求声明在使用之前。 (但一般来说,我会在类的成员函数 认为是一个不好的特性,要避免可读性原因。该 事实函数定义必须是在类中 Java是一个主要的理由不使用该语言在大 项目。)

+1

我相信OP相当清楚*为什么*位。 OP只要求提供相同的权威性参考文献(例如Dennis Ritchie论文或类似文献)。 –

+0

是的,蓝月亮是对的,这个答案并不是我正在寻找的东西,但它仍然很有趣。我知道如果没有指定返回类型,C会采用int返回类型,但我不知道C编译器不会抱怨未定义的符号。这对我来说似乎很奇怪。感谢您的回答,我会进一步研究这一点;)这可能是我在文中提到的。 –

+1

@ Moonsurfer_1它会(并且总是会)抱怨未声明的变量,尽管即使在那里,“隐式int”也是如此。 (例如,你可以编写'static a;',它会被解释为'static int a;')。我承认在这里的大学论文中没有太多可以引用的东西---这更多的是个人化的回忆。这主要是由于机器速度慢或者其他原因造成的。它或多或少是当时做事的标准方式(甚至在像Pascal这样的语言中也没有任何隐式声明)。 –