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