我有三个文件。
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的开头。我能想到的每一个组合都包含在内,每个组合都会给出一组不同的错误。有时它是多个定义,有时它是未定义的函数......
这究竟是如何运作的?我应该在哪些文件中添加哪些文件以及包含哪些文件以及在哪里?
答案 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.c
和tree.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