如何对包含指向自身的指针的结构进行类型定义?
How to typedef a structure including pointers to itself?
没有 typedef
的代码(并且有效):
struct Node {
int data;
struct Node *next;
struct Node *prev;
};
我正在尝试使用 typedef
为双向链表中的结构 "Node" 创建代码,但这不起作用:
typedef struct {
int data;
Node *next;
Node *prev;
} Node;
有没有办法使用 typedef
解决这个问题?
在typedef内部,还不知道要定义的类型,所以需要引入并使用一个struct标签:
typedef struct Node_tag {
int data;
struct Node_tag *next;
struct Node_tag *prev;
} Node;
Node_tag
是结构标记,因为它被引入的位置(而不是因为名称部分“_tag”)。它本身不是一种类型,只有 struct Node_tag
的组合是一种可用于结构成员的类型。
之后,当typedef完成时,类型Node
已经被定义。
澄清一下,第二个 typedef 可能是 typedef struct Node_tag NodeToo;
。这表明类型 struct Node_tag
也是可用的。这就是为什么我更喜欢使用“_tag”名称片段,以便清楚使用的内容。
您可以使用结构的前向声明
typedef struct sNode Node; // this is a typedef and a declaration of the struct
struct sNode{
int data;
Node *next;
Node *prev;
};
这种方式 Node
是已知的(但未定义),在您的 struct
的定义中。
这可以像 Yunnosch 那样进行压缩。但是你需要在声明中使用 struct Name
符号。
这样,如果您的结构中有一些循环依赖项,就可以使用类型定义的名称,并且前向声明是必要的。
也可以使用结构名称作为 typedef:
typedef struct Node Node;
struct Node{
int data;
Node *next;
Node *prev;
};
我个人比较喜欢第一种风格,对我来说好像"clearer",但是第二个例子没什么问题,只要compiler is not from the pre-standard era (before 1989).
正如 Jens Gustedt 所指出的,如果 C++ 中包含第一种样式,则第一种样式可能不兼容。
所以也许我应该将我的偏好更改为第一个。
在结构内部,您确实必须使用编译器已知的类型。在您的情况下,符合此规则的一种方法是在声明 typedef struct Node
后 使用 struct Node *
类型。在这种情况下,即使编译器在结构内部遇到类型 struct Node
时定义不完整,名称是已知的,编译器也知道指针的大小(保留在内存中),所以它没有理由投诉!
此外,也可以使用与 struct
之后的类型相同的名称:您可以对两者使用 Node
。
这是我建议的解决方案:
typedef struct Node {
int data;
struct Node *next;
struct Node *prev;
} Node;
没有 typedef
的代码(并且有效):
struct Node {
int data;
struct Node *next;
struct Node *prev;
};
我正在尝试使用 typedef
为双向链表中的结构 "Node" 创建代码,但这不起作用:
typedef struct {
int data;
Node *next;
Node *prev;
} Node;
有没有办法使用 typedef
解决这个问题?
在typedef内部,还不知道要定义的类型,所以需要引入并使用一个struct标签:
typedef struct Node_tag {
int data;
struct Node_tag *next;
struct Node_tag *prev;
} Node;
Node_tag
是结构标记,因为它被引入的位置(而不是因为名称部分“_tag”)。它本身不是一种类型,只有 struct Node_tag
的组合是一种可用于结构成员的类型。
之后,当typedef完成时,类型Node
已经被定义。
澄清一下,第二个 typedef 可能是 typedef struct Node_tag NodeToo;
。这表明类型 struct Node_tag
也是可用的。这就是为什么我更喜欢使用“_tag”名称片段,以便清楚使用的内容。
您可以使用结构的前向声明
typedef struct sNode Node; // this is a typedef and a declaration of the struct
struct sNode{
int data;
Node *next;
Node *prev;
};
这种方式 Node
是已知的(但未定义),在您的 struct
的定义中。
这可以像 Yunnosch 那样进行压缩。但是你需要在声明中使用 struct Name
符号。
这样,如果您的结构中有一些循环依赖项,就可以使用类型定义的名称,并且前向声明是必要的。
也可以使用结构名称作为 typedef:
typedef struct Node Node;
struct Node{
int data;
Node *next;
Node *prev;
};
我个人比较喜欢第一种风格,对我来说好像"clearer",但是第二个例子没什么问题,只要compiler is not from the pre-standard era (before 1989).
正如 Jens Gustedt 所指出的,如果 C++ 中包含第一种样式,则第一种样式可能不兼容。
所以也许我应该将我的偏好更改为第一个。
在结构内部,您确实必须使用编译器已知的类型。在您的情况下,符合此规则的一种方法是在声明 typedef struct Node
后 使用 struct Node *
类型。在这种情况下,即使编译器在结构内部遇到类型 struct Node
时定义不完整,名称是已知的,编译器也知道指针的大小(保留在内存中),所以它没有理由投诉!
此外,也可以使用与 struct
之后的类型相同的名称:您可以对两者使用 Node
。
这是我建议的解决方案:
typedef struct Node {
int data;
struct Node *next;
struct Node *prev;
} Node;