C中简单的头文件可见性混淆

时间:2011-12-17 15:54:20

标签: c header

我在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:现在我决定将结构定义放在头文件中......

3 个答案:

答案 0 :(得分:4)

此行为是预期的。当您#include "location.h"时,只有头文件对编译器可见。 location.c文件稍后会在链接时出现。

您有两种选择:

  1. 添加一个函数,您在location.h中声明并在location.c中定义,该函数执行必要的malloc并返回指针。
  2. 将结构的完整定义移动到头文件。

答案 1 :(得分:2)

main文件知道名为struct的{​​{1}}(和typedef)。它不知道它有多大,因此你不能将Location_Struct应用于它。

由于您有效地隐藏了布局和sizeof的实现,因此提供一个分配它的“构造函数”是有意义的。

修改

似乎我必须提到“构造函数”,我指的是一个普通的函数,它可以访问结构的实现,并且可以分配并可能预先填充对象。

答案 2 :(得分:1)

您需要将Location_Struct的定义放在头文件location.h中。编译器不会“看到”其他源文件(除非它是#include,这通常不是一个好主意)。