每日一问15:C++中的.h,cpp以及.hpp文件
1. 编译器角度的头文件(.h)和源文件(.cpp)
先从编译器角度,来看一下头文件(.h)和源文件(.cpp):
对于头文件(.h),在预处理阶段,头文件被包含到源文件后,它的使命就基本结束了。头文件包含了程序运行中可能需要用到的变量和函数等,在编译过程中,编译器只检查所使用的函数和变量的声明是否存在,对于源文件中的实现并不关心。源文件编译后成生成目标文件(obj文件),目标文件中,这些函数和变量就视作一个个符号。链接器会将所有的目标文件链接起来,组成一个exe程序。在link的时候,需要在makefile里面说明需要连接哪个obj文件,此时,链接器去.obj文件中找在.cpp中实现的函数,再把他们build到makefile中指定的那个可以执行文件中。
一个.cpp对应一个.obj,然后链接器将所有的.obj链接起来,组成一个.exe程序。如果一个.cpp要使用另一个.cpp定义的函数,只需在这个.cpp中写上它的函数声明即可。链接器将所有的obj链接起来,但是如果碰巧有相同的函数或外部变量怎么办?C++可以通过一种叫做链接属性的关键字来限定,某个函数是属于整个程序公用的,还是只在一个编译单元obj里面使用,这些关键字就是extern(外部链接)和static(内部链接)。
2. 为什么需要头文件(.h)和源文件(.cpp)
-
如果在h文件中实现一个函数体,那么如果在多个C文件中引用它,而且又同时编译多个C文件,将其生成的目标文件连接成一个可执行文件,在每个引用此头文件的C文件所生成的目标文件中,都有一份这个函数的代码,如果这段函数又没有定义成局部函数,那么在连接时,就会发现多个相同的函数,就会报错。
-
如果在h文件中定义全局变量,并且将此全局变量赋初值,那么在多个引用此头文件的C文件中同样存在相同变量名的拷贝,关键是此变量被赋了初值,所以编译器就会将此变量放入DATA段,最终在连接阶段,会在DATA

2418

被折叠的 条评论
为什么被折叠?



