[英]A typedef struct syntax
typedef struct {
int Key_value;
Node *link;
}Node;
以上声明有效吗? 还是我应该使用
typedef struct _node{
int Key_value;
_node *link;
}Node;
不,它是无效的(如果您尝试对其进行编译,您会注意到)。
直到typedef
之后才引入typedef
别名,因此您不能在其内部使用它。
第二个也是无效的(在C中), _node
也不是有效的类型名称。 您必须使用struct _node
作为自引用。
我倾向于使用预声明并将其拆分:
typedef struct Node Node;
struct Node {
int Key_Value;
Node *link;
};
关键是您实际上可以为结构和typedef赋予相同的名称:
typedef struct Node {
int Key_value;
struct Node *link;
} Node;
在这里,我添加了一些内容,这些内容将导致您的代码无法在C编译器中编译:在定义结构之后才创建typedef
。 这意味着我们必须在link
成员声明中使用结构名称。
这可以通过给结构命名(如上)或首先声明typedef
来解决:
typedef struct Node *Node;
struct Node {
int Key_value;
Node *link;
};
还要注意,在C ++中,在声明link
成员时不需要使用typedef
关键字或struct
关键字:
// C++ version
struct Node {
int Key_value;
Node *link;
};
结构(和类)名称可以用作C ++中的类型。
第一个声明无效,因为在将link
声明为结构成员时不知道Node
。 原因是声明名称仅在声明器之后可见(简单地说,即在逗号,等号或分号之后)。 因此, typedef
就像其他声明一样,名称Node
仅在结束声明语句的最后一个分号后才可见。
因此,您必须使用第二种形式(第一种形式甚至不会编译)。 但是,如果您使用的是C语言,请注意,应在_node
struct
关键字,如下所示:
typedef struct _node {
int Key_value;
struct _node *link;
} Node;
如果您使用的是C ++,则没有必要。
两者均无效。 对于C和C ++,这是一种有效的方法:
struct Node
{
int Key_value;
struct Node *link;
};
// if C, you can also do this
typedef struct Node Node;
要点是,无论Link
的类型是什么,它都必须是已经声明的 。 行struct X { ....
声明struct X
是一个类型(但尚未定义它,但是可以)。
在C中,您应该执行以下操作:
typedef struct _node {
int Key_value;
struct _node *link;
} Node;
但是,如果您使用的是C ++,则根本不需输入typedef
:
struct Node {
int Key_Value;
Node* link;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.