在 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 YListNode
和YListNode
不是一个好主意(令人困惑)。一个好的解决方案是在 typedef 的名称前面加上一个小的 t
,意思是“类型”,例如struct YListNode ... tYlistNode;
您可能会告诉我们哪个编译器会打印该消息,以及除了纯数字之外是否还有更具描述性的文本。
【参考方案1】:
struct
定义的顺序不是问题,而是与使用尚未定义的typedef
定义struct
成员有关...
在此声明中:
typedef struct YListNode
int Yval;
YListNode *next;
YListNode;
struct name
(或struct tag
)和struct
的typedef
使用相同的符号(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的主要内容,如果未能解决你的问题,请参考以下文章
在 AnyLogic 中为代理创建文本文件时出现 NullPointerExection 错误