【问题标题】:C structures declarationsC 结构声明
【发布时间】:2013-09-09 09:00:27
【问题描述】:

我在 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;

【问题讨论】:

标签: c struct structure


【解决方案1】:

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

struct NetworkNode;

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

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

...
struct NetworkNode target;
...

改为使用指针:

struct NetworkNode *target;

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

【讨论】:

  • 嗯,我刚才就是这样做的,但这不是解决方案。我仍然收到错误消息。
  • 他没有使用指针!
  • @PeterMiehle:是的,你是对的 - 谢谢!我已经更新了我的答案以提及这一点。
  • 好吧,我试图避免使用指针,但似乎这是不可能的。无论如何,在更改指针类型并修复我的一些功能后一切正常!感谢您的帮助
【解决方案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)

【讨论】:

    【解决方案3】:

    如果你输入

    struct NetworkNode target;
    

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

    通常会使用

    struct NetworkNode *target;
    

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

    您的声明的问题是:

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

    是,编译器无法评估 struct NetworkNode 类型的一个 Object 的大小。

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      相关资源
      最近更新 更多