C中两个结构定义的区别

时间:2016-11-07 15:46:04

标签: c

我想了解C中两种结构定义方式的区别。如果我创建这样的结构:

struct Node{
    float Point[DIM];
    struct kdNode *left, *right;
};

与以下内容不同:

struct Node{
    float Point[DIM];
    struct kdNode *left, *right;
}Node;

我在分号前添加结构名称。

4 个答案:

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

您希望在程序中使用的所有结构变量都需要与结构定义一起声明。

因此,使用第一个定义将是更好的选择。