【问题标题】:error C2061 when making structs for linked lists in c在 c 中为链表创建结构时出现错误 C2061
【发布时间】:2020-07-22 02:07:25
【问题描述】:

即使我尝试切换结构的位置以便它们将在正确的位置声明,但仍会出现此错误.. 这种方式似乎是正确的顺序,但仍然出现此错误。 似乎是什么问题?

typedef struct YListNode {
    int Yval;
    YListNode *next;
}YListNode;

typedef struct YList {
    YListNode *head;
    YListNode *tail;
}YList;

typedef struct XListNode {
    XListNode * prev;
    int Xval;
    YList yList;
    XListNode *next;
}XListNode;

typedef struct List {
    XListNode *head;
    XListNode *tail;
}List;

【问题讨论】:

  • 因为typedef 没有完成,你不能在正在定义的结构中使用typedef 的名称:YListNode *next; 无效。但是你可以使用它的struct 名称:struct YListNode *next;
  • 尝试使用你正在定义的结构的前向声明,参考here
  • 同时拥有struct YListNodeYListNode 不是一个好主意(令人困惑)。一个好的解决方案是在 typedef 的名称前面加上一个小的 t,意思是“类型”,例如struct YListNode {...} tYlistNode;
  • 您可能会告诉我们哪个编译器会打印该消息,以及除了纯数字之外是否还有更具描述性的文本。

标签: c list struct


【解决方案1】:

struct 定义的顺序不是问题,而是与使用尚未定义的typedef 定义struct 成员有关...

在此声明中:

typedef struct YListNode {
    int Yval;
    YListNode *next;
}YListNode;

struct name(或struct tag)和structtypedef 使用相同的符号(YListNode)。这是一个问题有两个原因:

  • 首先是歧义。将来维护代码将 编码人员需要特别注意应用此乘法 正确定义符号。

  • 解决您的具体问题的第二个问题是,在定义 struct typedef (YListNode) 之前,不应在其任何 成员 的定义中使用它struct

CLANG 编译器中的此配置导致此错误:9, 5 error: must use 'struct' tag to refer to type 'YListNode'

要解决此问题:
任一为这些 struct 组件选择不同的符号。 例如:

typedef struct yNode {
    int Yval;
    struct yNode *next;
}YListNode;

并且同样适用于其他声明。

使用以下置于结构定义语句之前的前向声明:

typedef struct YListNode YListNode;
typedef struct YList YList;
typedef struct XListNode XListNode;
typedef struct List List;

【讨论】:

  • 你确定吗?我们可以使用相同的符号。事实上,它喜欢:typedef struct YListNode YListNode;
  • @Hitokiri 是对的,这绝对是合法的,而且非常实用。你说的不太好,其实 YListNode 被称为 typedef struct .. struct 定义之后,所以YListNode *next 为时已晚
  • @Hitokiri - 是的,对于显示的配置,这是一个错误。在原始帖子中,问题是专门询问 why 显示的声明是发生错误。您关于使用前向声明的建议是另一种方法。
  • @bruno - 同意你的评价,它的措辞不好,我借用了我的编译器白话。
  • @Hitokiri - 你的英语很好 :) GCC 是一个很棒的编译器,我一直将它用于某些类型的项目,但是,depending on how the compiler settings are configured 它并不总是严格兼容.该链接详细讨论了该主题。最近我一直在使用 CLANG 编译器,这是我用来得出当前结论的那个。我并不认为您看到了您所评论的内容,但我相信该链接可以解释为什么我们会看到不同的结果。
【解决方案2】:

您可以使用前向声明先声明typedef struct,然后再定义它们。

这里是:

    /* forward declaration */
    typedef struct YListNode YListNode;
    typedef struct YList YList;
    typedef struct XListNode XListNode;
    typedef struct List List;

    typedef struct YListNode {
        int Yval;
        YListNode *next;
    }YListNode;

    typedef struct YList {
        YListNode *head;
        YListNode *tail;
    }YList;

    typedef struct XListNode {
        XListNode * prev;
        int Xval;
        YList yList;
        XListNode *next;
    }XListNode;

    typedef struct List {
        XListNode *head;
        XListNode *tail;
    }List;

【讨论】:

  • 我认为你可以更清楚,你给出如何解决但不给出为什么会出现问题;-)
猜你喜欢
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多