C语言中两种结构定义的区别
我想了解C中两种结构定义方式之间的区别。如果我创建这样的结构:C语言中两种结构定义的区别,c,C,我想了解C中两种结构定义方式之间的区别。如果我创建这样的结构: struct Node{ float Point[DIM]; struct kdNode *left, *right; }; struct Node Node2,Node3; 它与: struct Node{ float Point[DIM]; struct kdNode *left, *right; }Node; 其中,我在分号之前添加结构名称 第二个定义了一个名为Node的变量 相当于 st
struct Node{
float Point[DIM];
struct kdNode *left, *right;
};
struct Node Node2,Node3;
它与:
struct Node{
float Point[DIM];
struct kdNode *left, *right;
}Node;
其中,我在分号之前添加结构名称 第二个定义了一个名为
Node
的变量
相当于
struct Node{
float Point[DIM];
struct kdNode *left, *right;
};
struct Node Node;
在这两种情况下,实际结构的定义是相同的。唯一的区别是第二种情况下的变量定义
应该注意的是,结构标记名(直接位于struct
关键字之后的第一个节点
)位于单独的名称空间中,这就是为什么可以使用与结构同名的变量的原因
还应该注意的是,如果您在头文件中有变量定义,并且在多个源文件中包含头文件,那么您将有多个变量定义,并且在链接时会出现错误。第一种情况非常枯燥:没有什么好说的 在第二种情况下,
节点
也是结构节点
的一个实例
只要一点零钱
typedef struct Node{
float Point[DIM];
struct kdNode *left, *right;
} Node;
实现了C语言惯用的功能,即将
struct
注入typedef
名称空间,这意味着在引用此类型时不需要编写struct节点。第二个功能还定义了struct节点
。因此,Node.Point[0]
是有效的,而struct Node
本身也是一种类型
通常,如果您知道只需要两个该类型的变量,则第二个用于创建匿名结构:
struct {
float Point[DIM];
struct kdNode *left, *right;
}Node;
如果使用结构的第二个定义,则只允许创建该结构类型的一个变量,即与结构定义一起声明的变量
在这个定义中,
struct Node{
float Point[DIM];
struct kdNode *left, *right;
}Node;
不能声明更多类似以下内容的变量:
struct Node{
float Point[DIM];
struct kdNode *left, *right;
};
struct Node Node2,Node3;
要在程序中使用的所有结构变量都需要与结构定义一起声明
因此,使用第一个定义将是一个更好的选择。“第二个定义一个名为Node的变量。”-不一定!非常感谢你。。如果我添加typedef
,是否意味着我可以将该结构用作类型?@Olaf请澄清。“什么时候不是?”佩德罗卡利是的,这改变了很多事情。您没有定义变量,而是定义了一个类型别名,您可以使用Node
作为类型,而不是struct Node
@Olaf;有趣!启发我们?没有一个是结构definition@Olaf请解释一下。我认为两者都是定义,不要把普通语言和特殊术语混为一谈。C标准对定义进行了很好的定义。