c++ 编译之头文件

来源:百度文库 编辑:神马文学网 时间:2024/04/28 17:17:47
用makefile 编译C++程序的时候,我写makefile时有这样的感受。编写过程中我的一个.o依赖于一个.cpp文件,.cpp文件所对应的.h文件中引用了其他手工编写的.h文件.这时按照makefile的编写规则,我们是需要依赖于这样的.h文件。理由是:我们每一个.cpp文件是一个编译单元,对于这样一个编译单元,我们依赖于一些声明。记住我们都只是依赖于一些声明,当这些声明发生变化时,我们必须认为他依赖的文件已经发生了改变。我们有必要对其进行重新编译。其实际上我们可以这样认为,只有.cpp才能编译,.h最后都载入到了cpp中。也就是说.h的文件和.cpp的文件最终都参与了编译,最终的.h文件都是一些变量的定义和声明。我们的编译器首先把.h文件中的全部读入到.cpp中,然后进行编译,这时是按照编译单元来编译的,就是保证每一个单元都能正常编译通过。我们编译的时候要建立一个库用来记录每一个所有变量的定义,到时候要进行链接。我们先从main文件开始慢慢进行链接只要是函数地址我们就用函数编译后的相对地址,如果是变量,我们当然要换成变量地址。这样如果我们有函数或是变量的地址无法确定(可能是没有写函数的实现,或是有两种函数的实现,我们无法确定选那个来链接)就会出现链接错误。就像我们在一个头文件中定义了一个const类型的整形常量a和一个int  i类型的整形量。如果我们在几个.cpp文件中载入了此.h文件。经过预处理后我们进行编译时,在一个cpp文件中我们遇到一个变量i我们会把他登记入库,并给他地址。我们编译另一个.cpp之后我们的变量表中可能就会有两个对同一个变量i的两个记录。到了链接阶段我们就会发现我们无法确定链接的地址了。这时就是一个链接错误了,呵呵。