2

我在 C 中声明结构时遇到问题。我需要创建一个具有 ConnectionNode 数组和连接节点的 NetworkNode,因为您知道这会导致错误:

错误:字段“目标”的类型不完整

这个问题的解决方案是什么?

顺便提一句。这是代码:

struct ConnectionNode
{
    char* name;
    struct NetworkNode target;
};

typedef struct ConnectionNode ConnectionObject;

struct NetworkNode
{
    char* name;
    int i;
    struct ConnectionNode connections[10];
};

typedef struct NetworkNode NetworkObject;
4

3 回答 3

2

在程序的最开始,添加前向声明NetworkNode

struct NetworkNode;

这使编译器能够理解是什么,NetworkNode并打破您在定义中ConnectionNode需要提及的 catch-22,NetworkNode反之亦然。

更新:此外,您需要更改 ConnectionNode 的定义:

...
struct NetworkNode target;
...

改为使用指针:

struct NetworkNode *target;

如果没有这个,编译器将不知道为 NetworkNode 分配多少内存(即使使用前向声明)。另一方面,指针总是具有相同的大小。

于 2013-09-09T09:06:50.960 回答
2

我不确定,但尝试在此处使用指针并通过在使用它之前声明结构来进行前向引用。添加指向结构的指针NetworkNode(例如 *target),以便编译器为引用NetworkNode结构的指针保留 2 个字节的内存。但是当你声明时struct NetworkNode target,编译器不知道大小,它会抛出错误“不完整的类型”

struct NetworkNode;
struct ConnectionNode
{
    char* name;                      //pointer 2 bytes
    struct NetworkNode *target;      //pointer 2 bytes
};                                  //total 4 bytes reserved

当你喜欢的时候,

struct NetworkNode;
struct ConnectionNode
{
    char* name;                      //pointer 2 bytes
    struct NetworkNode target;       //unknown size of target as it is not YET defined
};                                  //total size: unknown (error: incomplete type)
于 2013-09-09T09:18:15.390 回答
1

如果你输入

struct NetworkNode target;

编译器必须知道结构的大小才能为目标分配足够的内存;

通常人们会使用

struct NetworkNode *target;

引用另一个对象(带有单独的 malloc),这可以作为前向声明来完成。

您的声明的问题是:

struct ConnectionNode {
  struct NetworkNode target;
}
struct NetworkNode {
  struct ConnectionNode connection;
}

也就是说,编译器无法评估 struct NetworkNode 类型的一个对象的大小。

于 2013-09-09T09:20:31.350 回答