C:类型结构的不完整定义

时间:2015-05-01 05:31:44

标签: c struct

这个错误似乎很容易解决,但我一直在尝试并且一无所知。

所以我有三个文件:

symtable.h:

typedef struct symbolTable *SymTable_T;

symtablelist.c:

#include "symtable.h"

struct Node{
    char* key;
    void* value;
    struct Node* next;
};

struct symbolTable{
    struct Node* head;
    int length;
};

SymTable_T SymTable_new(void){

/* code */

}

和main.c:

#include "symtable.h"

int main(int argc, const char * argv[]) {
    // insert code here...
    SymTable_T emptyTable = SymTable_new();

    emptyTable->length = 3;   <------- ERROR

    return 0;
}
  

我收到错误:类型&#34; struct symbolTable&#34;

的定义不完整

任何人都可以给我一个提示吗?

我在源文件中声明我的结构的原因是我将有另一个头文件的实现。那么除了移动我的结构声明之外还有另一种修复我的错误的方法吗?

2 个答案:

答案 0 :(得分:4)

您无法使用不透明指针直接访问成员 - 如果您将实现保留在单独的源文件中,则必须通过您的界面访问所有成员,而不是直接弄乱结构。

例如,将其添加到symtable.h

void SymTable_set_length(SymTable_T table, int len);

这到symtablelist.c

void SymTable_set_length(SymTable_T table, int len)
{
    table->length = len;
}

并在main.c中更改此内容:

emptyTable->length = 3;

到此:

SymTable_set_length(emptyTable, 3);

虽然在这种特殊情况下,将长度作为参数传递给SymTable_new()是一个明显优越的解决方案。更优越的是,根本不让用户设置链表数据结构的长度 - 长度是其中的项目数,它就是它的本质。例如,向列表中添加三个项目,然后允许main.c将长度设置为2是没有意义的。 symtablelist.c可以私下计算和存储长度,main.c可以找出长度是多少,但main.c能够直接设置长度没有多大意义。实际上,将结构的成员隐藏在这样的不透明指针后面的全部意义正是为了防止客户端代码像这样混乱数据并以这种方式破坏数据结构的不变量。

如果要直接在main.c中访问成员,则必须使结构定义可见,没有其他选择。这意味着要么将结构定义放在头文件中(推荐),要么将其复制到main.c中(非常不推荐)。

答案 1 :(得分:3)

typedef symbolTable *SymTable_T;中,您指的是不存在的类型symbolTable。在C(与C ++不同)中,类型名为struct symbolTable。 (注意:自回答问题以来,问题已经改变以解决这个问题。)

还有第二个问题。在main.c中,代码需要能够查看struct symbolTable的定义,以便您能够引用emptyTable的字段。目前,该定义隐藏在.c文件中......应将其移至标题。