C++预编译和链接的问题

C++生成可执行代码的全过程。要经过几个步骤,依次是:预处理(处理宏定义、头文件等)——编译、优化(这里生成的是中间代码,比如说用汇编代码当中间代码,那么生成的就是汇编语... C++生成可执行代码的全过程。要经过几个步骤,依次是:预处理(处理宏定义、头文件等)——编译、优化(这里生成的是中间代码,比如说用汇编代码当中间代码,那么生成的就是汇编语言组成的汇编程序)——汇编(汇编后生存机器语言代码)——链接(生成可执行文件)

问题一:如果在一个程序文件中,比如说file1,我如果在file1中想调用file2中的函数的或,不是需要首先包含进来么,就是 #include “file1.c” 。这样的或,在预处理的时候,不就把file2这个文件里的函数等包含进file1里了么。就是说还没有编译之前,file1已经包含了file2文件的内容了。那么这样的或,不管在file1里调用什么,都必须先包含

预处理的作用不就是处理这些包含进来的文件的么,不是把外在的文件的内容替换进现在编辑的源程序里么。那么为什么在最后一步的时候,就是链接的时候还需要连接其余的函数等?

不是已经在预处理的时候把需要的函数等包含进本程序了吗?

问题二:经过编译成中间代码,或者说把C++编译成汇编程序,那么汇编程序再经过编译的时候,不就直接是机器语言了吗,这个时候不就可以执行了吗?怎么还要链接成可执行程序,这个时候链接起什么作用了?这个问题可能和第一个有点重复
展开
 我来答
kaixingui2012
2011-09-28 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:7774万
展开全部
一、预处理时,只是将“宏定义、头文件”加载到源文件中,编译某个目标文件时,只是完成本文件的逻辑处理与汇编代码生成,与其他源文件不相关。即:编译某个文件时,只是加工一个产品所需要的零件出来,这些零件要与其他零件共同组装起来才能形成产品。
二、根据一的结果,各目标文件还是单个零件呢,所以不能作为产品运行,需要将它们有机的组装起来,形成真正的产品,才能够正确运行。

如:编译file1时,file1中要调用file2中的某个函数,此时,只是在编译时在调用处设置为调用一个指针,究竟这个指针是谁,是在file2中才知道的,编译器不会管file2的内容的。链接时,编译器才会将各个部件有机的结合起来,形成可执行文件。
以上纯属个人对编译原理的理解,如有差错请高人们指正。
追问
很感谢你的回答,但是我还是不是很清楚。在预处理的时候,已经把头文件,加载到源文件中了。比如说在file1 中 #include "file2.c" 吧。那么file2中的所有内容不是加载到file1中吗?我看有些地方定义预处理就是这样定义的,就是用file1.c文件的内容去替换#include “file2.c” 这个命令,那么意思不就是把file2的内容全部加载进file1里么?

是这样吗?我想应该不是,因为你后面解释的和这个是矛盾的。能否再解释一下加载过程
追答
一般情况我们是不会做这种事的:#include "file2.c" 
我们只会#include "somefile.h" 只是头文件

#include "file2.c" 这种做法很罕见
如果真是这样写的程序,我们就无需对编译 "file2.c"了,因为,编译结果确如你所想,编译时已经加载了file2.c,那么,链接时,我们就不会去链接file2.o了!!
幻雅盈
2012-11-05
知道答主
回答量:15
采纳率:0%
帮助的人:1.8万
展开全部
我看了谭浩强的书,c++程序设计,第4章函数与预处理,“文件包含”处理,即129页,上面说头文件中包含的是函数声明,而不是函数定义。函数定义是不放在头文件中的,是放在函数库中或单独编译成目标文件的,在连接阶段,与用户的目标文件连接组成可执行文件。不知道是不是楼主那样理解的。楼主和“满意回答”者都很牛逼。请加一下我的qq1446119144,我也是学c++的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式