头文件如何连接到相应的.cpp文件?
这个问题在这里已经有了答案:
简而言之:头部与其实现之间没有关系。 一个可以没有另一个存在,或者两个可以放在与名称无关的文件中。
同时编译main.cpp
编译器如何知道yum.h
中yum.cpp
提到的任何函数的定义?
编译器不知道。 每次看到对yum.h
中或其他头文件中声明的yum.h
东西的引用时,它都会停留在寻找相应的定义上。
如果定义在编译器到达翻译单元末尾main.o
没有达到,它会在main.o
输出中写入不满意的引用,并注意它们来自哪个位置。 这被称为符号表。
然后编译器编译yum.cpp
, yum.cpp
找到yum.h
中的定义,并将它们的位置写入yum.o
的符号表中。
一旦所有的cpp
文件都被处理完毕,链接器就会抓取所有的.o
文件,并从它们中构建一个组合的符号表。 如果保留不满意的参考,它会发出错误。 否则,它将来自main.o
引用与来自main.o
的相应符号yum.o
,完成该过程。
考虑一个例子:假设yum.h
声明了一个在yum.cpp
定义的全局变量int yum = 0
,并且main.cpp
输出该变量。 编译器生成main.o
带有符号表的main.o
,表示“我需要int yum
在地址1234处的定义”,而yum.o
文件的符号表说“我在地址9876处有int yum
”。 Linker通过在地址1234处放置9876来匹配“我需要”和“我有”。
编译器不需要在其他代码文件中查找任何内容。
编译的结果是一个对象文件,其中包含占位符,用于在其他代码文件中定义的任何内容。 为了制作这些占位符,编译器只需要由合适的头部(声明,原型等)提供的信息。
填充占位符的步骤是链接器的工作,这在理论上是与编译器分离的工具。 (“在理论上”如同“可能是一个单独的工具,就像两个单独的工具一样。”)
将带有声明的头文件包含到执行代码文件(全部或部分声明)的原因是广泛传播的最佳实践,因为如果实现和声明不匹配,它允许编译器投诉。
因此,在编译main.cpp时,编译器知道如何查找yum.cpp中yum.h中提及的任何函数的定义?
编译器没有。 当它产生目标文件(这是编译的结果)时,它说那里 - 调用函数等等。 然后是链接过程,在该过程中,所有目标文件和库链接在一起以生成可执行文件。 当链接器看到所有的对象文件和库时,它知道在哪里找到该函数(或者如果找不到它,会产生错误)。
即编译器知道如何编译yum.cpp文件,因为在main.cpp文件或yum.h文件中没有对它的引用。
编译器也不知道。 程序员的工作是告诉编译器将所有必要的源文件编译成对象,并将它们全部传递给链接器。 它可以在IDE内部完成,这可以隐藏起来,或者您可能必须使用实用程序make
手动执行此操作。
另外为什么yum.h包含在yum.cpp中
当你编译C ++程序时,你通常会有类和它们的方法。 为了能够在其他源文件中使用类,它的定义必须在那里可见,因此它会转到标题。 在.cpp文件中实现的方法也必须在类内部首先声明,以便.cpp必须包含它的头。 即使对于独立函数,让编译器在实现中将头中的签名与签名进行匹配也更为简洁。
链接地址: http://www.djcxy.com/p/73303.html上一篇: How is the header file connected to the corresponding .cpp file?