【问题标题】:C: Incomplete definition of type structC:类型结构的不完整定义
【发布时间】:2015-05-01 05:31:43
【问题描述】:

这个错误似乎很容易修复,但我一直在尝试,但没有任何线索。

所以我有三个文件:

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;
}

我收到错误:“struct symbolTable”类型的定义不完整

谁能给我一个提示?

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

【问题讨论】:

  • 建议将结构定义放在头文件中(并消除结构的 typedef),然后在您想要声明结构实例的任何位置包含该头文件。

标签: c struct


【解决方案1】:

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

例如,将此添加到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 中(非常不推荐)。

【讨论】:

    【解决方案2】:

    在typedef symbolTable *SymTable_T; 中,您引用了一个不存在的类型symbolTable。在 C(与 C++ 不同)中,该类型被命名为 struct symbolTable。 (注意:自回答以来,问题已更改以解决此问题。)

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

    【讨论】:

    • 哎呀,对不起,我确实在头文件中的 symbolTable 之前放了“struct”。
    • 我在源文件中声明我的结构的原因是我将为头文件提供另一个实现。那么除了移动我的结构声明之外,还有其他方法可以修复我的错误吗?谢谢
    • 我不确定你的意思。也许如果你能清楚地表述它,它会提出另一个好问题,而不是在 cmets 中对这个问题进行后续处理。
    猜你喜欢
    • 2018-09-26
    • 2022-01-09
    • 2016-01-21
    • 2016-10-13
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多