
C++预编译和链接的问题
C++生成可执行代码的全过程。要经过几个步骤,依次是:预处理(处理宏定义、头文件等)——编译、优化(这里生成的是中间代码,比如说用汇编代码当中间代码,那么生成的就是汇编语...
C++生成可执行代码的全过程。要经过几个步骤,依次是:预处理(处理宏定义、头文件等)——编译、优化(这里生成的是中间代码,比如说用汇编代码当中间代码,那么生成的就是汇编语言组成的汇编程序)——汇编(汇编后生存机器语言代码)——链接(生成可执行文件)
问题一:如果在一个程序文件中,比如说file1,我如果在file1中想调用file2中的函数的或,不是需要首先包含进来么,就是 #include “file1.c” 。这样的或,在预处理的时候,不就把file2这个文件里的函数等包含进file1里了么。就是说还没有编译之前,file1已经包含了file2文件的内容了。那么这样的或,不管在file1里调用什么,都必须先包含
预处理的作用不就是处理这些包含进来的文件的么,不是把外在的文件的内容替换进现在编辑的源程序里么。那么为什么在最后一步的时候,就是链接的时候还需要连接其余的函数等?
不是已经在预处理的时候把需要的函数等包含进本程序了吗?
问题二:经过编译成中间代码,或者说把C++编译成汇编程序,那么汇编程序再经过编译的时候,不就直接是机器语言了吗,这个时候不就可以执行了吗?怎么还要链接成可执行程序,这个时候链接起什么作用了?这个问题可能和第一个有点重复 展开
问题一:如果在一个程序文件中,比如说file1,我如果在file1中想调用file2中的函数的或,不是需要首先包含进来么,就是 #include “file1.c” 。这样的或,在预处理的时候,不就把file2这个文件里的函数等包含进file1里了么。就是说还没有编译之前,file1已经包含了file2文件的内容了。那么这样的或,不管在file1里调用什么,都必须先包含
预处理的作用不就是处理这些包含进来的文件的么,不是把外在的文件的内容替换进现在编辑的源程序里么。那么为什么在最后一步的时候,就是链接的时候还需要连接其余的函数等?
不是已经在预处理的时候把需要的函数等包含进本程序了吗?
问题二:经过编译成中间代码,或者说把C++编译成汇编程序,那么汇编程序再经过编译的时候,不就直接是机器语言了吗,这个时候不就可以执行了吗?怎么还要链接成可执行程序,这个时候链接起什么作用了?这个问题可能和第一个有点重复 展开
2个回答
展开全部
一、预处理时,只是将“宏定义、头文件”加载到源文件中,编译某个目标文件时,只是完成本文件的逻辑处理与汇编代码生成,与其他源文件不相关。即:编译某个文件时,只是加工一个产品所需要的零件出来,这些零件要与其他零件共同组装起来才能形成产品。
二、根据一的结果,各目标文件还是单个零件呢,所以不能作为产品运行,需要将它们有机的组装起来,形成真正的产品,才能够正确运行。
如:编译file1时,file1中要调用file2中的某个函数,此时,只是在编译时在调用处设置为调用一个指针,究竟这个指针是谁,是在file2中才知道的,编译器不会管file2的内容的。链接时,编译器才会将各个部件有机的结合起来,形成可执行文件。
以上纯属个人对编译原理的理解,如有差错请高人们指正。
二、根据一的结果,各目标文件还是单个零件呢,所以不能作为产品运行,需要将它们有机的组装起来,形成真正的产品,才能够正确运行。
如:编译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了!!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询