我是c ++新手。我之前有使用python的经验,但c ++是我的第二语言。现在,我正在学习如何使用头文件和源文件来帮助组织和编译项目的时间。我理解引用头文件(#include“foo.h”)的正确语法是什么,但我不明白头文件本身如何引用main.cpp中的源文件(foo.cpp)。我没有在头文件中看到foo.cpp和main.cpp中的任何引用。编译器如何知道使用#include将foo.h与foo.cpp结合在一起?如果这个问题多余,请道歉。我已经尝试过了。我发现了很多关于如何使用头文件和源文件的信息,但没有很好地解释它们实际上是如何工作的。
答案 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.o
和foo.o
作为输入,然后链接器生成whatever.exe
并连接各个部分。如果函数不可解析(例如,您忘记在链接器调用中包含foo.o
)或者在多个obj文件中存在具有相同名称的函数,则链接器将产生错误。