我在C中遇到包含头文件的奇怪问题。
main.c中
#include <stdio.h>
#include <stdlib.h>
#include "location.h"
int waste_new_line();
int main()
{
location *crossroads = malloc(sizeof(*crossroads));
...
location.h
typedef struct Location_Struct location;
location.c
typedef struct Location_Struct {
int ID;
char *name;
char *description;
} location;
int setup_location(location* l, char* name)
{
...
现在这不起作用,因为
location *crossroads = malloc(sizeof(*crossroads));
抛出错误:解除指向不完整类型的指针意味着它可以看到location.h的内容,但它似乎并不知道location.c ...
我环顾四周,我见过的所有教程都说链接器会将两个文件链接在一起。
编辑:
我已将代码更改为在location.c中包含初始化程序,如下所示:
main.c中
...
#include "location.h"
int waste_new_line();
int main()
{
location *crossroads = initialize_location();
....
location.h
typedef struct Location_Struct location;
location* initialize_location();
location.c
...
typedef struct Location_Struct {
int ID;
char *name;
char *description;
} location;
location* initialize_location(location* l)
{
return malloc(sizeof(location));
}
...
这仍然会引发同样的错误,但只有当我尝试使用以下方式访问十字路口的成员时:
crossroads->description
这将导致引用不完整类型错误。
编辑2:现在我决定将结构定义放在头文件中......
答案 0 :(得分:4)
此行为是预期的。当您#include "location.h"
时,只有头文件对编译器可见。 location.c
文件稍后会在链接时出现。
您有两种选择:
location.h
中声明并在location.c
中定义,该函数执行必要的malloc
并返回指针。答案 1 :(得分:2)
main
文件知道名为struct
的{{1}}(和typedef)。它不知道它有多大,因此你不能将Location_Struct
应用于它。
由于您有效地隐藏了布局和sizeof
的实现,因此提供一个分配它的“构造函数”是有意义的。
似乎我必须提到“构造函数”,我指的是一个普通的函数,它可以访问结构的实现,并且可以分配并可能预先填充对象。
答案 2 :(得分:1)
您需要将Location_Struct
的定义放在头文件location.h中。编译器不会“看到”其他源文件(除非它是#include,这通常不是一个好主意)。