文件是怎么连起来的?
好像demo.cpp和Teacher.cpp没有关系,为什么运行demo.cpp可以用Teacher.cpp里的定义
好像demo.cpp和Teacher.cpp没有关系,为什么运行demo.cpp可以用Teacher.cpp里的定义
2017-09-17
从语法上说:函数只要声明了就可以使用(调用它),所以 cpp 文件只要 include 相应的函数头文件(头文件中就是函数声明)就可以使用这个函数,并不需要知道函数的实现。
那么你是好奇“为什么代码中没有实现也可调用呢”? 这需要你明白什么是“编译”和“链接”:
函数还是需要实现的,不过那是实现在其他 cpp 文件中的。
像这样由多个 cpp 构成的程序,其中每个 cpp 文件都是被编译器单独编译的。每一个 cpp 文件被称为一个“编译单元”。 注意编译器无需得知函数实现即可编译函数调用,它只要知道函数声明(需要声明只是为了进行类型检查)。
你可以想象的到,单个 cpp 文件并不能单独编译成可执行程序。这些 cpp 源码文件的编译结果需要“整合”起来,这就是链接。
进行链接是链接器的工作,它会找到不同编译单元间引用的变量和函数,处理好它们之间的访问和调用(这些具体是如何处理的你现在不用知道),然后综合这些结果生成最终的可执行程序。
所以就每个 cpp 来说,它确实不用管它用的函数是在哪里实现的,因为后续链接器会处理好这一切的。
假如某个使用的函数真的没有被任何一个 cpp 代码实现,那么最后链接器会发现它找不到这一函数的实现,就会报“未定义引用”这样的链接错误。
其实在一开始学习时写的那种很小的单文件程序中,你也使用了实现在其他地方的函数啊! 那些 printf 之类的库函数就是! 现在你回过头想一下:你只是 include 了相应的库头文件,就调用了 printf,你也没有实现 printf,但你同样成功调用了它! 实际上是你的编译环境提供了库函数的实现代码,最后链接器会负责找到标准库的实现并整合进你的程序中。
举报