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

我想了解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
的变量

相当于

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标准对定义进行了很好的定义。