繁体   English   中英

Typedef结构语法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM