-2

我有三个文件。

trees.h
// a bunch of typedefs and function prototypes
#include <trees.c>

trees.c
// a bunch of function bodies

main.c
#include <trees.h>

这是不对的,因为trees.c 中的每个函数都给我关于trees.h 中定义的类型的“未定义类型”错误。我已经尝试了所有我能想到的配置 - 包括来自 main 的trees.c,包括来自trees.c 的trees.h,在trees.h 的末尾包括trees.c,在trees.h 的开头包括它。 .我能想到的每种包含的组合,每个组合都会给出一组不同的错误。有时是多个定义,有时是未定义的函数......

那么这究竟是如何工作的呢?我在哪些文件中放了什么,我要包含哪些文件以及在哪里?

4

5 回答 5

1

像这样:

trees.h
// a bunch of typedefs and function declarations (prototypes)

trees.c
#include <trees.h>
// a bunch of function definitions (bodies)

main.c
#include <trees.h>

解释:

#include基本上与将整个包含文件复制到此文件(放置#include.

因此,包含trees.hinmain.c允许该文件了解trees.c.

包含trees.hintrees.c允许使用 in 较低的函数,这也是指定trees.c使用 in 的定义等的地方。trees.c

您也可能不知道创建多个对象并将它们链接起来,请参阅 Joachim Pileborg 的回答。

(非常丑陋的)替代方案是:

trees.h
// a bunch of typedefs and function declarations (prototypes)

trees.c
#include <trees.h>
// a bunch of function definitions (bodies)

main.c
#include <trees.c>

然后你只需要编译main. 但是对于任何几个.c文件的项目,这变得不切实际。

于 2013-02-13T11:05:31.790 回答
1

您将每个源文件编译为目标文件,然后将这些目标文件链接在一起以形成最终的可执行文件。如果您使用例如 GCC 并在命令行上编译,您可以将两个源文件放在命令行中,GCC 会为您处理它:

$ gcc main.c tree.c -o tree

上面的命令告诉gcc编译和链接文件main.ctree.c并命名输出可执行文件tree。您也可以将源文件单独编译成目标文件,然后手动将它们链接在一起:

$ gcc -c main.c -o main.o
$ gcc -c tree.c -o tree.o
$ gcc main.o tree.o -o tree

在上面的命令中,该-c选项告诉gcc创建一个目标文件,该-o选项告诉gcc该目标文件的名称。最后一个命令获取这些目标文件并创建最终的可执行文件并为其命名(使用-o选项)tree

在源文件中,您包含所需的标头,而不是相反。

于 2013-02-13T11:05:40.140 回答
1

它不起作用的原因是因为您必须使用“extern”来定义在与标准不同的包含文件中声明的变量或函数。您还应该将所有头文件保存为 *.h。因此,假设您在 tree.h 中定义了结构“树”:

#include <tree.h>

int main() {
    extern tree; /* Get variable 'tree' declared in tree.h */
    extern make_tree(void); /* Get function make_tree() declared in tree.h */

    make_tree(); /* Call function */
    return (0); /* End */
}
于 2013-02-13T14:51:08.463 回答
0

首先不包括实现 ( .c) 文件。仅包含头.h文件 ( )。只要您需要在其中声明的类型或函数,就包括它们。为避免多次声明,请使用包含警卫(无论它们是什么 - 只需 google 即可)。

于 2013-02-13T11:06:52.397 回答
0

要走的路是将头文件trees.h包含在trees.c中,然后将trees.c包含在main.c中

看看这个线程here

于 2013-02-13T11:07:30.887 回答