您的教授似乎有某种其他文件,例如professor_main.cc,并且他们将像这样编译项目:
g++ example.cc professor_main.cc -o project
他们的professional_main.cc 会有一行
#include "example.h"
它还将使用您的一些功能,并可能测试它们是否在做正确的事情:
std::cout << (example_add(2,3) == 5) ? "good" : "bad" << std::endl;
现在,如果他们没有#include example.h,或者如果你没有正确地制作那个文件,他们会在professor_main.cc 上得到一个编译错误,因为它不知道example_add(int,int)。应该在头文件中并使此错误消失的关键行是:
int example_add(int a, int b);
这称为函数声明。
如果头文件一切正常,但你的教授犯了一个错误,并试图在没有 example.cc 的情况下编译项目,如下所示:
g++ professor_main.cc -o project
然后他们会收到关于 example_add() 的“未定义引用”的链接器错误。
缺少的是函数定义:
int example_add(int a, int b) { return a + b; }
这应该在您的 example.cc 文件中,如果教授在他们的编译命令行中包含它,那么一切都应该很好。
但是,如果您在头文件中添加了#include "example.cc",那么一切都不会好。实际上,您随后会将 example.cc 复制并粘贴到professor_main.cc 中,因为它在那里#included。但它显然仍然在它自己的文件example.cc 中。因此,如果您的教授尝试这样做:
g++ example.cc professor_main.cc -o project
他们会从链接器获得多重定义错误,因为函数 example_add() 将被定义两次。
通常,您可能应该做的是将所有函数定义放在源文件 (.cc) 中,并将所有函数声明放在头文件 (.h) 中。尝试自己编译另一个 .cc 文件并尝试看看它是如何工作的。