预处理器和链接器的功能不明确

问题描述 投票:0回答:1

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

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

c linker preprocessor
1个回答
0
投票

这似乎是您了解翻译单位概念的好时机。

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

因此,如果存在函数的声明,编译器会知道这一点,但如果定义(实现)位于另一个 TU 中,那么编译器将不知道这一点。编译器可以生成对该函数的调用,但会在目标文件中留下一种注释,表明在另一个翻译单元中存在对函数的引用。

这就是链接器发挥作用的地方:它获取所有翻译单元(目标文件)和库,并解析对不同翻译单元中函数的引用。

© www.soinside.com 2019 - 2024. All rights reserved.