C 中的递归类型定义
recursive type definitions in C
我正在尝试用 C 实现链表。我尝试了以下实现:
// Attempt 1
typedef struct
{
Node *next;
Node *prev;
} Node;
// Attempt 2
typedef struct
{
struct Node *next;
struct Node *prev;
} Node;
第一个版本给我的错误是:unknown type name 'Node'
第二次编译但给出警告:assignment to 'struct Node *' from incompatible pointer type 'Node *' {aka 'struct <anonymous> *'}
当我这样使用它时
void link(Node * node) {
node->next = (Node) {node, NULL}
}
在 typedef 声明中未命名结构的声明中
typedef struct
{
Node *next;
Node *prev;
} Node;
用作数据成员 next
和 prev
的类型说明符的名称 Node
未声明。所以编译器报错。
在 typedef 声明中未命名结构的声明中
typedef struct
{
struct Node *next;
struct Node *prev;
} Node;
引入了类型说明符 struct Node
和未命名结构的 typedef 名称 Node
。它们是不同的类型说明符。也就是说 Node
和 struct Node
不是相同的说明符。
您需要的是以下内容
typedef struct Node
{
struct Node *next;
struct Node *prev;
} Node;
现在 Node
是类型说明符 struct Node
的别名。
注意这个函数定义
void link(Node * node) {
node->next = (Node) {node, NULL}
}
没有意义,编译器将再次发出错误。赋值语句的左操作数(你忘记放分号的地方)
node->next = (Node) {node, NULL};
具有 Node *
或 struct Node *
类型(如果您将更新 typedef 声明,如上所示),而右操作数是 struct Node
类型的复合文字。而且复合字面量自动保存,退出函数后不会存活
所以如果你愿意写
node->next = &(Node) {node, NULL};
指针node->next
退出函数后将失效
我正在尝试用 C 实现链表。我尝试了以下实现:
// Attempt 1
typedef struct
{
Node *next;
Node *prev;
} Node;
// Attempt 2
typedef struct
{
struct Node *next;
struct Node *prev;
} Node;
第一个版本给我的错误是:unknown type name 'Node'
第二次编译但给出警告:assignment to 'struct Node *' from incompatible pointer type 'Node *' {aka 'struct <anonymous> *'}
当我这样使用它时
void link(Node * node) {
node->next = (Node) {node, NULL}
}
在 typedef 声明中未命名结构的声明中
typedef struct
{
Node *next;
Node *prev;
} Node;
用作数据成员 next
和 prev
的类型说明符的名称 Node
未声明。所以编译器报错。
在 typedef 声明中未命名结构的声明中
typedef struct
{
struct Node *next;
struct Node *prev;
} Node;
引入了类型说明符 struct Node
和未命名结构的 typedef 名称 Node
。它们是不同的类型说明符。也就是说 Node
和 struct Node
不是相同的说明符。
您需要的是以下内容
typedef struct Node
{
struct Node *next;
struct Node *prev;
} Node;
现在 Node
是类型说明符 struct Node
的别名。
注意这个函数定义
void link(Node * node) {
node->next = (Node) {node, NULL}
}
没有意义,编译器将再次发出错误。赋值语句的左操作数(你忘记放分号的地方)
node->next = (Node) {node, NULL};
具有 Node *
或 struct Node *
类型(如果您将更新 typedef 声明,如上所示),而右操作数是 struct Node
类型的复合文字。而且复合字面量自动保存,退出函数后不会存活
所以如果你愿意写
node->next = &(Node) {node, NULL};
指针node->next
退出函数后将失效