这个错误似乎很容易修复,但我一直在尝试,但一无所知。
所以我有三个文件:
symtable.h:
typedef struct symbolTable *SymTable_T;
Run Code Online (Sandbox Code Playgroud)
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 */
}
Run Code Online (Sandbox Code Playgroud)
和 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;
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:“struct symbolTable”类型的定义不完整
任何人都可以给我一个提示吗?
我在我的源文件中声明我的结构的原因是我将有另一个头文件的实现。那么除了移动我的结构声明之外还有另一种方法来修复我的错误吗?
您无法使用不透明指针直接访问成员 - 如果将实现保存在单独的源文件中,则必须通过接口访问所有成员,而不是直接与结构混淆。
例如,将此添加到symtable.h:
void SymTable_set_length(SymTable_T table, int len);
Run Code Online (Sandbox Code Playgroud)
这到symtablelist.c:
void SymTable_set_length(SymTable_T table, int len)
{
table->length = len;
}
Run Code Online (Sandbox Code Playgroud)
并main.c改变这一点:
emptyTable->length = 3;
Run Code Online (Sandbox Code Playgroud)
对此:
SymTable_set_length(emptyTable, 3);
Run Code Online (Sandbox Code Playgroud)
尽管在这种特定情况下,将长度作为参数传递给SymTable_new()显然是一个更好的解决方案。更优越的是根本不让用户设置链表数据结构的长度——长度是其中的项目数,它就是它。例如,将三个项目添加到列表中,然后允许main.c将长度设置为 是没有意义的2。symtablelist.c可以私下计算和存储长度,也main.c可以查到长度是多少,但是没有太大意义main.c可以直接设置长度。实际上,将结构的成员隐藏在像这样的不透明指针后面的全部意义正是为了防止客户端代码能够像这样弄乱数据并以这种方式破坏数据结构的不变量。
如果要直接访问 中的成员main.c,则必须使结构定义可见,别无选择。这意味着要么将结构定义放在头文件中(推荐),要么复制它main.c(极不推荐)。