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