代码之家  ›  专栏  ›  技术社区  ›  KRISHNAKANT MALI

预处理器和链接器功能中的歧义

  •  0
  • KRISHNAKANT MALI  · 技术社区  · 2 年前

    请有人澄清我的疑虑,即在编译过程中,预处理器替换了预定义函数的声明,而不是定义,那么为什么我们在编译期间没有出现错误,即未定义为函数定义的函数在链接阶段编译后被添加到代码中??

    请有人告诉我们预处理器和链接的实际功能是什么?

    1 回复  |  直到 2 年前
        1
  •  3
  •   Some programmer dude    2 年前

    这似乎是你学习的概念的好时机 translation units .

    总之,翻译单元(简称TU)是一个包含所有头文件的单一源文件。这是编译器实际看到的,它对其他翻译单元一无所知。

    所以如果有 公告 对于函数,编译器会知道这一点,但如果 释义 (实现)在另一个TU中,那么编译器将不知道这一点。编译器可以生成对函数的调用,但在对象文件中留下一种注释,即引用了另一个翻译单元中的函数。

    这就是链接器的作用所在:它接受所有转换单元(对象文件)和库,并解析对不同转换单元中函数的引用。


    头文件本身从不单独“编译”,它们总是包含在源文件中。基本上,头文件的代码是复制粘贴到源文件中的。

    因此,一旦预处理器完成,编译器和链接器都不知道任何关于头文件的信息。他们看到的只是单一的翻译单元。