KRISHNAKANT MALI Asked: 2024-05-06 13:15:57 +0800 CST2024-05-06 13:15:57 +0800 CST 2024-05-06 13:15:57 +0800 CST 预处理器和链接器功能的歧义 772 请有人澄清我的疑问,在编译过程中,预处理器替换了预定义函数的声明,而不是定义,那么为什么我们在编译过程中没有收到错误,未定义为函数定义的函数在链接阶段编译后添加到代码中? 请有人告诉我预处理器和链接的实际功能是什么? c 1 个回答 Voted Best Answer Some programmer dude 2024-05-06T13:28:37+08:002024-05-06T13:28:37+08:00 这似乎是您了解翻译单元概念的好时机。 总而言之,翻译单元(简称 TU)是包含所有包含的头文件的单个源文件。这是编译器实际看到的,它对其他翻译单元一无所知。 因此,如果有函数声明,编译器就会知道这一点,但如果定义(实现)位于另一个 TU 中,那么编译器将不会知道这一点。编译器可以生成对该函数的调用,但会在目标文件中留下一种注释,表明在另一个翻译单元中存在对函数的引用。 这就是链接器发挥作用的地方:它获取所有翻译单元(目标文件)和库,并解析对不同翻译单元中函数的引用。 头文件本身永远不会自行“编译”,它们始终包含在源文件中。基本上,头文件的代码被复制粘贴到源文件中。 因此,一旦预处理器完成,编译器和链接器都不知道有关头文件的任何信息。他们看到的只是单个翻译单元。
这似乎是您了解翻译单元概念的好时机。
总而言之,翻译单元(简称 TU)是包含所有包含的头文件的单个源文件。这是编译器实际看到的,它对其他翻译单元一无所知。
因此,如果有函数声明,编译器就会知道这一点,但如果定义(实现)位于另一个 TU 中,那么编译器将不会知道这一点。编译器可以生成对该函数的调用,但会在目标文件中留下一种注释,表明在另一个翻译单元中存在对函数的引用。
这就是链接器发挥作用的地方:它获取所有翻译单元(目标文件)和库,并解析对不同翻译单元中函数的引用。
头文件本身永远不会自行“编译”,它们始终包含在源文件中。基本上,头文件的代码被复制粘贴到源文件中。
因此,一旦预处理器完成,编译器和链接器都不知道有关头文件的任何信息。他们看到的只是单个翻译单元。