C: 类型结构的不完整定义
C: Incomplete definition of type 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;
}
I'm getting error: Incomplete definition of type "struct symbolTable"
任何人都可以给我提示吗?
我在我的源文件中声明我的结构的原因是我将有另一个头文件的实现。那么除了移动我的结构声明之外,还有其他方法可以修复我的错误吗?
在 typedef symbolTable *SymTable_T;
中,您引用了 non-existent 类型 symbolTable
。在 C 中(与 C++ 不同),该类型被命名为 struct symbolTable
。 (注意:问题已更改以解决此问题。)
还有第二个问题。在 main.c
中,代码需要能够看到 struct symbolTable
的定义,以便您能够引用 emptyTable
的字段。目前,该定义隐藏在 .c
文件中...它应该移动到 header.
您不能使用不透明指针直接访问成员 - 如果将实现保留在单独的源文件中,则必须通过接口访问所有成员,而不是直接弄乱结构。
例如,将此添加到 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
中复制它(非常不推荐)。
这个错误似乎很容易修复,但我一直在尝试但没有任何线索。
所以我有三个文件:
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;
}
I'm getting error: Incomplete definition of type "struct symbolTable"
任何人都可以给我提示吗?
我在我的源文件中声明我的结构的原因是我将有另一个头文件的实现。那么除了移动我的结构声明之外,还有其他方法可以修复我的错误吗?
在 typedef symbolTable *SymTable_T;
中,您引用了 non-existent 类型 symbolTable
。在 C 中(与 C++ 不同),该类型被命名为 struct symbolTable
。 (注意:问题已更改以解决此问题。)
还有第二个问题。在 main.c
中,代码需要能够看到 struct symbolTable
的定义,以便您能够引用 emptyTable
的字段。目前,该定义隐藏在 .c
文件中...它应该移动到 header.
您不能使用不透明指针直接访问成员 - 如果将实现保留在单独的源文件中,则必须通过接口访问所有成员,而不是直接弄乱结构。
例如,将此添加到 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
中复制它(非常不推荐)。