头文件如何连接到相应的.cpp文件?

GRA*_*ZER 6 c++ compilation header

根据我所阅读和理解的内容,#include源文件中的指令(例如ex:)main.cpp只是将包含文件的内容复制到.cpp.因此,当我包含头文件时,对于ex:,yum.h所有语句yum.h都被复制到main.cpp.

头文件只有声明,实际定义将在相应的.cpp文件中,如yum.cpp.

因此,在编译时main.cpp,如何将编译器知道要查找提及任何函数的定义yum.h中yum.cpp?编译器如何知道如何编译yum.cpp文件,因为在main.cpp文件或文件中都没有引用它yum.h.

另外,为什么要yum.h加入yum.cpp?

这听起来像是一个愚蠢的问题.我是OOP和C++的初学者,我只是想了解发生了什么.

das*_*ght 10

简短回答:标题与其实现之间没有关系.一个可以在没有另一个的情况下存在,或者两者可以放在具有不相关名称的文件中.

在编译过程中main.cpp如何将编译器知道要查找提及任何函数的定义yum.h中yum.cpp?

编译器不知道.每次它看到对在其中声明的内容yum.h或任何其他头文件的引用时,它都会留意相应的定义.

如果编译器到达翻译单元结束时定义不存在,它会将未满足的引用写入其main.o输出,并注明它们来自的位置.这称为符号表.

然后编译器编译yum.cpp,从中查找定义yum.h,并将其位置写入yum.o符号表.

一旦所有cpp文件已被处理,连接抓住所有.o文件,并从他们那里建立一个组合符号表.如果仍有不满意的引用,则会发出错误.否则,它将引用main.o与相应的符号链接起来yum.o,完成该过程.

考虑一个例子:假设yum.h声明了一个int yum = 0定义的全局变量yum.cpp,并main.cpp打印该变量.编译器main.o使用符号表生成"我需要int yum在地址1234处定义",yum.o文件的符号表说"我int yum在地址9876".链接器将"我需要"与"我有"匹配,将9876放在地址1234.