一个typedef结构语法

时间:2014-04-03 11:50:21

标签: c++ c

typedef struct {
int Key_value;
Node *link;
}Node;

以上声明是否有效?或者我应该使用

typedef struct _node{
int Key_value;
_node *link;
}Node;

5 个答案:

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