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

这个问题在这里已经有了答案:

  • 编译/链接过程如何工作? 5个答案
  • C ++:编译器和链接器功能8个答案

  • 简而言之:头部与其实现之间没有关系。 一个可以没有另一个存在,或者两个可以放在与名称无关的文件中。

    同时编译main.cpp编译器如何知道yum.hyum.cpp提到的任何函数的定义?

    编译器不知道。 每次看到对yum.h中或其他头文件中声明的yum.h东西的引用时,它都会停留在寻找相应的定义上。

    如果定义在编译器到达翻译单元末尾main.o没有达到,它会在main.o输出中写入不满意的引用,并注意它们来自哪个位置。 这被称为符号表。

    然后编译器编译yum.cppyum.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?

    下一篇: How do libraries work at compile & link times