2013-02-13 79 views
-2

我有三个文件。你打算如何将文件包含在C项目中?

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中的每个函数都给出了有关在tree.h中定义的类型的“未定义类型”错误。我试过了我能想到的所有配置 - 从main包含trees.c,并在trees.c中包含trees.h,在trees.h的末尾包含trees.c,并将其包含在trees.h的开头。 。我能想到的每一个包含的组合,每个组合都给出了一组不同的错误。有时它是多重定义,有时它是未定义的函数...

那么究竟是如何工作?我在哪些文件中放入了哪些文件,哪些文件包含在哪些文件中?

+1

你为什么在任何东西中包含'tree.c'? – Mat 2013-02-13 11:05:20

+0

预处理指令#include基本上复制您包含在指定位置的文件的内容,包括(请参阅http://msdn.microsoft.com/zh-cn/library/36k2cdd4%28v=vs.71%29。 ASPX)。因此,你的#include 是你有这种不确定的类型错误的原因:他们的原型之前已经复制的功能的实现。 – JBL 2013-02-13 11:13:25

回答

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)。

因此在main.c中包含trees.h允许该文件知道trees.c中的功能。

包括trees.htrees.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文件的任何项目,这变得不切实际。

+0

但在第一个例子,如何main.c中知道的功能trees.h的定义是?为什么编译器不会只抛出某种“没有定义的函数原型”错误?它怎么说,它知道如何寻找在trees.c - 这是无处提及 - 找到那些定义? – 2013-02-13 12:24:33

+1

@JackM:在第一个例子中,编译器不看在trees.c在编译main.c中。编译main.c所需要的只是原型,而不是函数体。链接器稍后需要函数体,这就是为什么您需要知道如何创建多个对象文件并将它们链接起来。 – 2013-02-13 12:28:53

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

在源文件中,您包含所需的标题,而不是其他方式。

0

开始不包括执行(.c)文件。只包含标题(.h)文件。只要你需要在其中声明的类型或函数,就包括它们。为了避免多次声明,使用include guard(无论它们是什么 - 只是谷歌它)。

0

去是包括trees.c你的头文件trees.h然后包括main.c中

内trees.c的方式看一看这个线程here

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 */ 
} 
相关问题