C - 头文件中的结构定义

时间:2015-04-09 02:32:57

标签: c gcc compiler-errors opaque-pointers

我有两个带有头文件的结构。

我的结构编号1是:

标题文件'list.h':

typedef struct list * List;

源文件'list.c':

struct list {
    unsigned length;
    char * value;
};

我的结构编号2是:

标题文件'bal.h':

typedef enum {START, END, MIDDLE, COMMENTS, CONDITIONS} TypeListBal;
typedef struct bal * Bal;

源文件'bal.c':

i've include those header files : 
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "list.h"

struct bal {
    TypeListBal type;
    List name;              // Name of the bal
    List attributes[];          // Array of type struct List
};

当我尝试在bal.c文件中使用函数时:

Bal createBal(List name){

char * search;
const char toFind = '=';
    search = strchr(name->value, toFind);

}

我在这一行收到错误:search = strchr(name->value, toFind); 说:错误:解除指向不完整类型的指针

我不知道为什么因为我已经在我的bal.c中包含了list.h

我已经在Stackoverflow上阅读了很多内容,称其所谓的程序类型为:opaque类型 这似乎是非常好,但我不知道如何使用我的其他头文件到其他源文件。 我认为我必须要做的就是将我的list.h包含在我的bal.c文件中。

我正在用这个commamd编译gcc:gcc -g -W -Wall -c bal.c bal.h

非常感谢你!

2 个答案:

答案 0 :(得分:2)

.h文件只有structtypedef的声明。

typedef struct list * List;

这并没有提供struct成员的任何线索。他们被隐藏了#34;在.c文件中。当编译器编译bal.c时,它无法知道struct list有成员value

您可以通过以下几种方式解决此问题:

  1. struct list的定义也放在.h文件中。
  2. 提供可以获取/设置struct list对象值的函数。

答案 1 :(得分:0)

当您包含标题文件时,那就是您正在做的所有事情。在头文件中,您只有以下行:

typedef struct list * List;

尝试从main使用此结构会导致编译器抱怨不完整的类型,因为从源文件的角度来看,此结构没有成员。事实上,它根本没有定义。

你需要把:

struct list;
typedef struct list * List;

在您的标头文件中。但请注意,此过程会创建一个不透明的结构!这就意味着这样做。

List l1;
l1->data = 0; //error

不允许,因为编译器只能看到头文件中包含的内容。在该编译单元中,结构中不存在变量。

可以有意使用 ,强制用户通过getter / setter获取数据类型。像

这样的东西
int data = ListStuff_Get_Item1(l1);

可以完成,但ListStuff_Get_Item1()函数需要在.h中声明,并在.c中定义。