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;是啥意思

模板合集