您打算如何在C项目中包含文件?

时间:2013-02-13 11:03:04

标签: c include

我有三个文件。

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的开头。我能想到的每一个组合都包含在内,每个组合都会给出一组不同的错误。有时它是多个定义,有时它是未定义的函数......

这究竟是如何运作的?我应该在哪些文件中添加哪些文件以及包含哪些文件以及在哪里?

5 个答案:

答案 0 :(得分: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.h中加入main.c可以让该文件了解trees.c中的功能。

trees.h中包含trees.c允许trees.c中较低的函数可用,这也是指定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个文件的任何项目,这都变得不切实际。

答案 1 :(得分: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

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

答案 2 :(得分:1)

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

#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 */
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

可行的方法是在trees.c中包含头文件trees.h,然后在main.c中包含trees.c

看一下这个帖子here