-3

所以我有 2 个文件需要上交,调用它们:example.cc 和 example.h

我们被告知他们的测试代码只会#include "example.h"

通常我一直使用#include "example.cc",因为它已经在它的声明中包含了example.h。

当我运行测试代码时,每当我在测试代码中提到示例时,我都会得到“未定义的 example::example..”,这显然是因为测试代码只能看到我在 example.h 中的声明,而不是它们的实际执行。

我错过了什么?我在example.h中尝试过#include example.cc,但这显然是不对的。

4

3 回答 3

3

您的教授似乎有某种其他文件,例如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 文件并尝试看看它是如何工作的。

于 2013-03-26T18:39:01.337 回答
1

在 C++(和它的起源 C)中,想法是文件(*.h在 C 中,在 C++ 中没有扩展名)包含声明(没有可执行代码,内联函数除外),而代码文件(*.c in C,*.cc in C++) contain all executable code, and#include`声明他们需要什么的头文件。请注意,实现一些更广泛使用的时髦类的文件还应该包括声明它的头文件,以避免由于声明不同而难以追踪错误。

C/C++ 预处理器是一个笨蛋,它只是替换文本,并且#include只是逐字复制文件的内容。所以你可以做各种奇怪的扭曲,比如在#incuded 文件中开始一个语句并在外面完成它,或者在头文件中包含可执行代码。我会编译并正常工作,但真正重要的是下一个阅读代码的人是否理解它(我的意思是几天后你)。你的助教不会因为你的代码组织得不好而受苦,她只会皱着眉头给你一个 F。会在努力让它工作的同时。

他们大概的意思是你应该实现,比如说,给出在头文件class foo中使用所需的声明(并且只有未洗过的大众应该看到的工作原理!),以及一个给出实际实现的代码文件;他们将提供哪些包含和链接来测试您的课程。class foofoo.hclass foofoo.ccbar-uses-foo.ccfoo.hfoo.o

于 2013-03-26T18:39:10.497 回答
0

您需要使用编译器链接文件,然后构建它们。另一件事是除了头文件之外的每个文件中,您都需要包含头文件。

这样的事情应该有帮助

gcc -c example.c -o example.o
gcc example.o -o example

如果您添加另一个使用标题的文件:

gcc -c file1.c -o file1.o 
gcc -c file2.c -o file2.o
gcc file1.o file2.o -o myprogram

术语gccg++都是 Linux 和 Unix 编译器。如果您使用的是 windows dev c++ 应该可以工作或使用gcc for windows

于 2013-04-12T17:04:05.073 回答