C++头文件中函数声明定义

就是为什么一般是在头文件内声明,而在与头文件文件名相同的cpp源代码文件中定义函数的具体代码呢?那运行时又是怎么调用的呢?能直接在头文件内定义吗?会有什么区别吗?... 就是为什么一般是在头文件内声明,而在与头文件文件名相同的cpp源代码文件中定义函数的具体代码呢?那运行时又是怎么调用的呢?能直接在头文件内定义吗?会有什么区别吗? 展开
 我来答
对床话雨
2014-05-01 · TA获得超过1636个赞
知道小有建树答主
回答量:171
采纳率:100%
帮助的人:150万
展开全部
其实,网上有很多类似的文章,随便百度一下就可以查明白,虽然明白,但我还是帮你百度了一下系统的文章。

C++/C源程序通常分为两类文件。一类文件用于保存程序的声明,称为头文件;另一类文件用于
保存程序的实现,称为源文件(或者定义文件)。
编译器在扫描到一条函数调用语句时首先应当知道该函数的原型或定义,函数原型一般都放在头文件中,函数定义则放在源文件中,当源文件或头文件通过#include指令包含另一个头文件的时候,编译预处理器用头文件的内容取代#include伪指令。这就是说,头文件的所有内容最终都会被合并到某一个或某几个源文件中,如此将每一个包含的头文件递归地展开后形成的源文件就叫编译单元。如果象你说的,直接在头文件中定义函数的执行代码,也是可以的,但这会造成编译单元多了一些不必要的代码。

头文件的主要作用如下:

1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户
提供头文件和二进制的库即可
2)头文件能加强类型安全检查。如果某个接口被实现或被使用时的方式与头文件中的声明不
一致,编译器就会指出错误
3)头文件可以提高程序的可读性(清晰性)。
追问
那多个源文件又是怎么连接在一起的呢
追答
编译器一般是以C、CPP这样的执行代码源文件作为一个单独的编译单元,先把它们分别编译转换成汇编代码,将汇编代码翻译成等效的机器码,生成OBJ文件,一个编译单元一个OBJ文件,OBJ文件是COFF格式的,由很多Section头和Section组成,包含各功能函数重定位信息,利用link链接器,可以把多个OBJ文件和编译器提供的库文件链接起来,最终生成直接执行的EXE或COM程序。我只是说了一个大概,你可以自己去查一下编译原理相关的资料,应该全面得多。另外,所有编译单元中,同一个函数只能存在一个,否则编译器就会报错,因为它无法判断应该使用哪个函数入口地址。这就是为什么,我们定义的函数不能重名,不能使用关键字来定义变量,如果使用的函数在多个库文件都有的,还要用using namespace指明使用哪个库等等。
ddqxy138
2014-05-01 · TA获得超过133个赞
知道小有建树答主
回答量:228
采纳率:0%
帮助的人:164万
展开全部
头文件是用来被包含的,它可以被多个源文件包含。包含(#include) 相当于把头文件的内容插入到源文件。

函数声明可以有多次,定义只能有一次。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友21a360264
推荐于2016-11-30 · TA获得超过1855个赞
知道小有建树答主
回答量:640
采纳率:100%
帮助的人:355万
展开全部
定义只能有一次,而声明的次数不限。任何标识符在使用前至少要有声明,将声明放在头文件中,就可以在需要使用到标识符时随时把头文件包含进来即可。如果把定义放进头文件中,那每包含一次头文件,标识符就定义了一次,这样在多文件的编译连接时很容易出问题的。
包含其实就相当于把被包含文件的内容加入到其中,和用被包含文件中的内容替换掉对应的包含语句没有区别。使用头文件的好处就是免除了重复劳动的麻烦。
反正最终编译器都是把被包含文件的内容合并到一块才编译的。所以这样,LZ觉得运行时的调用跟调用任何一个函数有区别吗。
追问
不同源文件是怎样连接的?
追答
源文件不是连接的,源文件之间可以用包含,也就是可以用#include 。而连接是针对目标文件和库文件的。
整个完整的Build编译过程实际上具体是分四步进行的,即预处理、编译至汇编代码、汇编编译、连接目标文件与库。一般看不到或者不需要注意中间这些环节的。
预处理阶段,负责头文件包含和宏替换等所有以“#”号开头的指令行的处理工作,找不到头文件的错误发生在此阶段。
编译阶段,分编译到汇编代码和将汇编编译成机器代码,大多数编译器默认选择的是跳过产生汇编代码的阶段直接产生目标文件。目标文件中包含的是编译后各个标识符的定义和函数的机器指令代码。源文件是分开编译的,每个.c源代码文件单独产生一个.obj目标文件。所有词法和语法性错误和警告在此阶段发生,因为此编译阶段完成意味着目标文件中的函数代码片段是可以交由CPU去执行的具体机器指令了。
连接是针对.obj目标文件和相关的.lib库文件,连接形成最终的.exe可执行文件。每个项目中生成一个.exe可执行文件。同一个项目中的多个源文件产生的目标文件参与同一个.exe可执行文件的生成。C不生成.com可执行文件,那是汇编语言干的。
C要求每个项目都要有而且只能有一个main函数的定义。由main函数引用到的所有名字,比如调用了什么函数,对哪个变量进行读写操作等涉及到的标识符,连接程序自动到项目的各个目标文件中去找这些名字的定义,然后到库文件中去找,目标文件中的函数还可能又引用到更多的标识符。直到所有名字的定义都找到,将它们全部串接到一起,排好地址记录并打包就成了.exe可执行文件。如果头文件出问题,则连接时多半会发生“找不到XXX符号的定义”或者“XXX符号定义冲突”等错误。

LZ暂时只需知道编译实际是分多个阶段进行的这句话就够了,等需要自己调试编译时才需要了解这些详情。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式