C++ 编译器如何知道它可以在哪个翻译单元或源文件中找到标头中的声明?我的意思是,头文件中各种声明的实现可以在多个文件中,对吗?那么编译器如何知道选择哪一个呢?
而且,当使用外部变量时,编译器如何知道它定义在哪个文件中?
C++ 编译器如何知道它可以在哪个翻译单元或源文件中找到标头中的声明?我的意思是,头文件中各种声明的实现可以在多个文件中,对吗?那么编译器如何知道选择哪一个呢?
而且,当使用外部变量时,编译器如何知道它定义在哪个文件中?
编译器不知道在哪里找到定义。
链接器是查看编译对象并将包含标头的对象与包含函数或外部变量实现的对象/库链接在一起的工具。链接器将它应该组合在一起的目标文件和库的列表以及它应该查看的那些列表作为输入。
由于原始问题的术语,我误解了这个问题,所以这个答案实际上并没有回答这个问题。但是,我将把它留在这里以供将来关于预处理器的参考。
预处理器的#include
指令可以看作是在源文件中指令所在的位置创建了一个临时文件,该文件包含所有包含的头文件的内容。#include
如果您使用 GCC,您可以-E
在编译文件时使用该选项,告诉 GCC 在 preprocessign 阶段后停止,以便您自己查看该文件。
为了让编译器知道特定声明位于哪个文件和源代码行,预处理器输出所谓的“行”指令。这些是编译器识别并用于设置当前文件名和行号的特殊指令(与预处理器指令非常相似)。参见GCC 手册中的这个部分。