我想了解C中两种结构定义方式的区别。如果我创建这样的结构:
struct Node{
float Point[DIM];
struct kdNode *left, *right;
};
与以下内容不同:
struct Node{
float Point[DIM];
struct kdNode *left, *right;
}Node;
我在分号前添加结构名称。
答案 0 :(得分:5)
第二个定义名为Node
的变量。
相当于
struct Node{
float Point[DIM];
struct kdNode *left, *right;
};
struct Node Node;
两种情况下实际结构的定义相同。唯一的区别是第二种情况下的变量定义。
应该注意的是,结构标记名称(Node
关键字后面的第一个struct
)位于单独的名称空间中,这就是为什么可以使用与结构同名的变量。
还应该注意,如果在头文件中有变量定义,并且在多个源文件中包含头文件,那么您将有多个变量定义,并且在链接时会出错。
答案 1 :(得分:2)
第一种情况非常沉闷:没有太多可说的。
在第二种情况下,Node
也是 struct Node
的实例。
稍作修改,
typedef struct Node{
float Point[DIM];
struct kdNode *left, *right;
} Node;
你在C中实现了一些惯用的东西,即将struct
注入typedef
命名空间意味着当你想引用这种类型时你不需要写struct Node
答案 2 :(得分:0)
第二个也定义struct Node Node
。因此Node.Point[0]
有效,而struct Node
本身也是一种类型。
如果您知道只需要几个这种类型的变量,通常第二个用于创建匿名结构:
struct {
float Point[DIM];
struct kdNode *left, *right;
}Node;
答案 3 :(得分:0)
如果使用结构的第二个定义,则只允许创建该结构类型的一个变量,即与结构定义一起声明的变量。
在此定义中,
struct Node{
float Point[DIM];
struct kdNode *left, *right;
}Node;
你不能声明更多这样的变量:
struct Node Node2,Node3;
您希望在程序中使用的所有结构变量都需要与结构定义一起声明。
因此,使用第一个定义将是更好的选择。