一个typedef结构语法

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仅在结束声明语句的最后一个分号后可见。

因此,您必须使用第二种forms(第一种forms甚至不会编译)。 但是,如果你在C上,请注意你应该将struct关键字添加到_node ,如下所示:

 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; }