为了账号安全,请及时绑定邮箱和手机立即绑定

文件是怎么连起来的?

好像demo.cpp和Teacher.cpp没有关系,为什么运行demo.cpp可以用Teacher.cpp里的定义

正在回答

3 回答

从语法上说:函数只要声明了就可以使用(调用它),所以 cpp 文件只要 include 相应的函数头文件(头文件中就是函数声明)就可以使用这个函数,并不需要知道函数的实现


那么你是好奇“为什么代码中没有实现也可调用呢”? 这需要你明白什么是“编译”和“链接”:

函数还是需要实现的,不过那是实现在其他 cpp 文件中的。

像这样由多个 cpp 构成的程序,其中每个 cpp 文件都是被编译器单独编译的。每一个 cpp 文件被称为一个“编译单元”。 注意编译器无需得知函数实现即可编译函数调用,它只要知道函数声明(需要声明只是为了进行类型检查)。

你可以想象的到,单个 cpp 文件并不能单独编译成可执行程序。这些 cpp 源码文件的编译结果需要“整合”起来,这就是链接

进行链接是链接器的工作,它会找到不同编译单元间引用的变量和函数,处理好它们之间的访问和调用(这些具体是如何处理的你现在不用知道),然后综合这些结果生成最终的可执行程序。

所以就每个 cpp 来说,它确实不用管它用的函数是在哪里实现的,因为后续链接器会处理好这一切的。


假如某个使用的函数真的没有被任何一个 cpp 代码实现,那么最后链接器会发现它找不到这一函数的实现,就会报“未定义引用”这样的链接错误。


其实在一开始学习时写的那种很小的单文件程序中,你也使用了实现在其他地方的函数啊! 那些 printf 之类的库函数就是!   现在你回过头想一下:你只是 include 了相应的库头文件,就调用了 printf,你也没有实现 printf,但你同样成功调用了它!  实际上是你的编译环境提供了库函数的实现代码,最后链接器会负责找到标准库的实现并整合进你的程序中。

3 回复 有任何疑惑可以回复我~
#1

潇潇_暮雨 提问者

谢谢你!
2017-09-24 回复 有任何疑惑可以回复我~
#2

潇潇_暮雨 提问者

还想问你个问题,我在慕课网的视频上看到定义了.h文件和.cpp文件,在.cpp中引用了.h文件,但是最后老师直接在.h文件里面运行程序,这是怎么回事?
2017-09-24 回复 有任何疑惑可以回复我~
#3

onemoo 回复 潇潇_暮雨 提问者

不明白你说的是什么意思。 编译出来的程序是另一个可执行文件,运行它就是运行程序。这和其他的 .h .cpp 文件都没有关系。 那么你说的“直接在.h文件里面运行程序”是什么意思?!
2017-09-24 回复 有任何疑惑可以回复我~

源文件之间调用  extern 调用函数  ,如果调用的是自己编写的头文件就用  include "调用文件";


0 回复 有任何疑惑可以回复我~
#1

潇潇_暮雨 提问者

但是老师上课的视频里面并没有
2017-09-20 回复 有任何疑惑可以回复我~

那是因为你在demo.cpp中加入了Teacher.cpp的头文件(Teacher.h)

0 回复 有任何疑惑可以回复我~
#1

潇潇_暮雨 提问者

demo.cpp文件里应该并没有加teacher.cpp吧?我看视频上的源文件并没有发现加了,只是这两个文件共同引用了teacher.h。为什么运行demo.cpp时能引用teacher.cpp里的文件?
2017-09-20 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之封装篇(上)
  • 参与学习       103410    人
  • 解答问题       701    个

封装--面向对象的基石,本教程力求帮助小伙伴们即学即会

进入课程

文件是怎么连起来的?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信