头文件如何引用源文件c ++?

时间:2017-06-02 19:33:34

标签: c++ header-files

我是c ++新手。我之前有使用python的经验,但c ++是我的第二语言。现在,我正在学习如何使用头文件和源文件来帮助组织和编译项目的时间。我理解引用头文件(#include“foo.h”)的正确语法是什么,但我不明白头文件本身如何引用main.cpp中的源文件(foo.cpp)。我没有在头文件中看到foo.cpp和main.cpp中的任何引用。编译器如何知道使用#include将foo.h与foo.cpp结合在一起?如果这个问题多余,请道歉。我已经尝试过了。我发现了很多关于如何使用头文件和源文件的信息,但没有很好地解释它们实际上是如何工作的。

2 个答案:

答案 0 :(得分:2)

没有。

首先,仅仅因为有一个foo.h,并不意味着有一个foo.cpp。

所以,你真正的问题是“编译器如何知道将main.cpp和foo.cpp放入同一个可执行文件中?”基本上,因为你告诉他们。

在不同的操作系统,编译器和构建系统上,这是完全不同的,但基本上,你可以做两件事之一。

a)您单独编译文件,然后将它们链接在一起:

 cl main.cpp
 cl foo.cpp
 link main.obj foo.obj

b)将它们编译在一起:

 cl main.cpp foo.cpp

(这实际上只是上述的快捷方式,编译器会自动执行各个步骤)

答案 1 :(得分:1)

他们没有。

每个.c.cpp文件都是一个生成obj文件(.o)的编译单元。这是编译器所做的一切。每个obj文件可能包含未解析的引用。例如,如果您的main.cpp使用foo()中声明并在foo.h中实现的函数foo.cpp,则foo.o将包含已编译的代码对于foo()main.o将包含main()的已编译代码,其中包含对foo()内容的调用。但是,main.o并不知道foo()实际上在哪里,并且它不了解foo.o

然后,链接器将obj文件链接在一起。这是在解析obj中未解析的引用时。链接器将main.ofoo.o作为输入,然后链接器生成whatever.exe并连接各个部分。如果函数不可解析(例如,您忘记在链接器调用中包含foo.o)或者在多个obj文件中存在具有相同名称的函数,则链接器将产生错误。