typedef struct {
int Key_value;
Node *link;
}Node;
以上声明是否有效?或者我应该使用
typedef struct _node{
int Key_value;
_node *link;
}Node;
答案 0 :(得分:4)
不,它无效(正如你试图编译它时会注意到的那样)。
在typedef
之后,typedef
别名不会被引入,因此您无法在其中使用它。
第二个也不是有效的(在C中),_node
不是有效的类型名称。您必须使用struct _node
进行自我引用。
我倾向于使用预先声明并将其拆分:
typedef struct Node Node;
struct Node {
int Key_Value;
Node *link;
};
答案 1 :(得分:1)
问题是你实际上可以为结构和typedef赋予相同的名称:
typedef struct Node {
int Key_value;
struct Node *link;
} Node;
在这里,我添加了一些会导致您的代码无法在C编译器中编译的内容:{<1}}在定义结构之后才会创建typedef
。这意味着我们必须在link
成员声明中使用结构名称。
这可以通过给结构命名(如上所述)或首先声明typedef
来解决:
typedef struct Node *Node;
struct Node {
int Key_value;
Node *link;
};
另请注意,在C ++中,在声明typedef
成员时,您不需要使用struct
关键字或link
关键字:
// C++ version
struct Node {
int Key_value;
Node *link;
};
结构(和类)名称可以在C ++中用作类型。
答案 2 :(得分:0)
第一个声明无效,因为当您将Node
声明为结构成员时,link
未知。原因是声明名称仅在声明符之后可见(简单地说,就是在逗号之后,等号或分号)。因此,typedef
与任何其他声明一样,名称Node
仅在结束声明语句的最后一个分号后可见。
因此,您必须使用第二种形式(第一种形式甚至不会编译)。但是,如果您使用的是C,请注意您应该将struct
关键字添加到_node
,如下所示:
typedef struct _node {
int Key_value;
struct _node *link;
} Node;
如果您使用的是C ++,则无需这样做。
答案 3 :(得分:0)
两者都无效。对于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
是一种类型(但尚未定义它,但没关系)。
答案 4 :(得分:0)
在C中你应该这样做:
typedef struct _node {
int Key_value;
struct _node *link;
} Node;
但是,如果您使用的是C ++,则可以更简单地省略typedef
:
struct Node {
int Key_Value;
Node* link;
}