在 c 中为链表创建结构时出现错误 C2061

Posted

技术标签:

【中文标题】在 c 中为链表创建结构时出现错误 C2061【英文标题】:error C2061 when making structs for linked lists in c 【发布时间】: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; 您可能会告诉我们哪个编译器会打印该消息,以及除了纯数字之外是否还有更具描述性的文本。 【参考方案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;

【讨论】:

我认为你可以更清楚,你给出如何解决但不给出为什么会出现问题;-)

以上是关于在 c 中为链表创建结构时出现错误 C2061的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中为链表编写通用搜索函数?

在 C++ 中为链表类创建实例

C 编程为链表类型结构分配空间

在 AnyLogic 中为代理创建文本文件时出现 NullPointerExection 错误

Grafana Alert/AzureMonitor:在 Grafana 中为图形创建警报规则时出现执行错误

类前向声明​​失败,没有递归包含