struct的两个名字是啥,为啥我不能把最下面的一个作为数据类型放在里面?
Posted
技术标签:
【中文标题】struct的两个名字是啥,为啥我不能把最下面的一个作为数据类型放在里面?【英文标题】:What are the two names of the struct, and why can't I put the bottom one as a data type inside it?struct的两个名字是什么,为什么我不能把最下面的一个作为数据类型放在里面? 【发布时间】:2021-06-09 16:57:38 【问题描述】:我使用 typedef 关键字定义了以下结构:
typedef struct
int data;
NODE *next;
NODE;
编译时出现以下错误:
错误:未知类型名称“节点” 查了一下,发现这个栈溢出post,说应该改成
typedef struct n
int data;
n *next;
NODE;
我对此有两个问题。
首先,n
是什么?我以为NODE
是结构的名称,那是第二个名称吗?
第二个是,为什么我可以把n
作为数据类型,而不是NODE
?
【问题讨论】:
这能回答你的问题吗? typedef struct vs struct definitions 即使是相关的,也不能直接回答我的问题,不 【参考方案1】:NODE
不是结构的名称。这是一个typedef
,即结构的别名。在第一种情况下,结构是未命名的。在第二种情况下,结构被命名为struct n
。
您不能在结构中使用NODE
的原因是在使用它时该名称尚未定义。所以你需要使用结构的实际名称(是定义的)来创建一个指向它的指针。
另请注意,在使用结构名称时,C 中需要 struct
关键字,即:
struct n *next;
【讨论】:
为什么还没有定义NODE? @DuarteArribas 因为它出现在next
之后的文件中。【参考方案2】:
使用您的组合结构定义和typedef
,名称NODE
在您尝试使用它时尚未在该位置定义。
typedef struct
int data;
NODE *next; // name NODE used here
NODE; // name NODE defined here
你可以在结构定义之前做 typedef 来使用它作为一个指针。
typedef struct n NODE; // NODE defined as incomplete type
struct n
int data;
NODE *next; // use as pointer is OK
;
// from here NODE is completely defined
但是在真正定义结构之前,您不能定义NODE
类型的变量或结构字段。
typedef struct n NODE;
#if 0
// does not work because NODE is an incomplete type here
struct wrapper
NODE node;
;
#endif
// using a pointer to an incomplete type is OK
struct n
int data;
NODE *next;
;
// works
struct wrapper
NODE node;
;
你可以使用
typedef struct n // type "struct n" known here
int data;
struct n *next; // use known type
NODE; // type alias NODE known here
因为struct n
类型在您用于指针时已经知道。
请注意,在 C 中您必须使用 struct n *next
(与 C++ 不同)。
【讨论】:
以上是关于struct的两个名字是啥,为啥我不能把最下面的一个作为数据类型放在里面?的主要内容,如果未能解决你的问题,请参考以下文章
struct stat *buf 这里的stat和*buf分别是啥?
[Android UI界面] 软键盘覆盖edittext 使用ScrollView的详解、、高手快来吧
左边是个图片的DIV 右边是个div 右边文字div的为啥在最下面的导航下面?
typedef struct ElemType *elem; int length; int listsize; SqList;其中ElemType *elem;是啥意思