c语言编译过程分割编译的各个目标函数必须在同一个文件夹里么

4.3.1 源文件分割
】 浏览:86次
4.3.1& 源文件分割
一个很出名的减少代码大小的技术就是:对于两个很大的函数,如果某些程序只需要其中的一个函数,而不需要另外一个函数,那么我们就应该把这两个函数分别放于不同的程序库实现文件里面。我们把这种技术称为源文件分割技术(智能编译系统没有使用这种技术的必要,因为它们本身就可以实现相似的技术,但现今几乎不存在这样的编译系统)。现在请考虑4.2.2节的BSTreebase类:class&BSTreebase&{ &public: &&&&&&int&size()& &&&&&&void&thread(); &&&&&&//... &}; &
假设由于参数的原因,上面两个函数都很大(实际上,size函数通常都是很小的)。而且可能存在某些程序,它们只需要其中的一个成员函数,而并不需要另外一个成员函数,那么源文件分割技术将指导我们把这两个函数的定义分别放在不同的文件里面。另外,如果thread函数需要调用私有成员函数dothread,并且只有thread调用dothread函数,那么源文件分割技术也要求我们把dothread函数和thread函数放在同一个文件里面。
当我们考虑模板的时候,事情将变得更加复杂一点。假设4.2.2节的BSTree模板类并不是从类BSTreebase继承而来的:
template&T&class&BSTree{ & &&&&&&int&size()& &&&&&&void&thread(); &&&&//... &}; &
当我们编写BSTree类的模板成员函数的定义时,为了使用户的模板实例化程序可以存取这些函数,我们就必须把这些函数的定义放在公共头文件里面,而且,用户的模板实例化程序还需要进一步组织模板源代码(我们将在9.7节详细叙述用户的这种需求),因此,在这种情况下,我们就不能在这些函数定义的目标代码中进行源文件分割,因为我们根本就没有这个选择的权利。
如果对一个大的程序库强行应用源文件分割,那么可能会产生问题。首先,现有的许多用于创建和操纵目标代码的档案文件的程序不能处理包含几百个小文件的档案文件。为了解决这个问题,现有的许多()程序库都提供几个比较小的档案文件,而不是只提供一个大的档案文件。然而,这个解决方案的使用要慎重一些,因为它要求(程序库)用户切记按照正确的顺利链接所有的档案文件。
其次,如果我们在程序库中创建了调试变量(见5.3.1节),那么许多库的目标文件将会包含许多重复的信息。如果程序员接着使用我们程序库的调试变量来创建某个程序的调试变量,那么程序的代码数量将会急剧增大,而这有背源文件切割的初衷。
为了解决上面这两个问题,我们可以放宽对源文件切割的要求;把那些可能会在同一个程序里使用的函数集合都放在同一个文件里面。但在这种情况下,不再能够保证仍然可以得到最小化的正确链接时间开销。
【】【】【】
【】【】【】谭浩强C语言,第一章, 连接时,要连接我们已经编译好的目标文件,和启动代码,和库函数。三部分。_百度知道C语言(31)
& & & & 程序中通常会有大量的函数调用,这些被调用的函数只要有声明(而不需要定义实现),编译器就可以成功处理。在生成可执行文件的过程中,连接器将各个可执行程序的代码段组合到一起,而有函数调用的地方还需要找到真正的函数定义才可以完成连接。因此,函数的定义和调用者可以在一个代码段内,也可以在不同的代码段内。连接器会根据需要根据实际的情况修改编译器生成的机器代码,完成正确的跳转。
函数跳转的连接过程如图:
& & & & 与函数跳转类似的是全局变量的访问,在C语言编译的过程中,程序可以访问用extern声明的外部全局变量,在连接的过程中,连接器需要找到实际变量在数据段中的位置,完成正确的变量访问。
程序中全局变量的连接如图所示。
& & & & 对于可执行文件的生成,其主要的工作是组合各个目标文件中的三个段。还将包含一些其他的过程。首先,所有的可执行程序都需要指定一个入口,在C语言中入口即main函数,在一个C语言的应用程序各个源文件中,只能包含一个main函数。其次,不同系统所使用的可执行程序可能包含不同的头信息,头信息是在主要段之外附加的信息,可以供操作系统加载可执行程序的时候使用。
& & & & 知识点:在连接过程之前,各个源文件生成目标文件相互没有关系。在连接之后,各目标文件函数和变量可以相互调用和访问,从而被联系在一起。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:31742次
积分:1440
积分:1440
排名:千里之外
原创:114篇
(1)(5)(15)(24)(5)(8)(16)(4)(2)(2)(2)(35)C语言基础练习题(含答案)(1)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
C语言基础练习题(含答案)(1)
上传于||暂无简介
大小:15.77KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢C语言中,如何用多个文件编写程序_百度知道}

我要回帖

更多关于 c语言编译过程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信