声明和定义结构有什么区别?

时间:2009-09-14 20:39:09

标签: c++ c

struct {
    char a;
    int b;
} x;

为什么要定义这样的结构而不是仅仅将其声明为:

struct x {
    char a;
    int b;
};

5 个答案:

答案 0 :(得分:18)

在第一种情况下,只有变量x可以是那种类型 - 严格来说,如果你定义了具有相同主体的另一个结构y,它将是一个不同的类型。因此,当您不需要任何其他相同类型的变量时,可以使用它。请注意,您不能将事物转换为该类型,使用该类型的原型声明或定义函数,或者甚至动态分配该类型的变量 - 没有要使用的类型的名称。

在第二种情况下,您没有定义变量 - 您只需定义一个类型struct x,然后可以使用该类型创建所需数量的变量。当然,这是更正常的情况。它通常与typedef

结合或相关联
typedef struct x
{
    char a;
    int b;
} x;

通常,您将使用更具信息性的标签名称和类型名称。对结构标记(第一个'x')和typedef名称(第二个'x')使用相同的名称是完全合法和安全的。

对于第一近似值,当您使用普通的'struct x {...};'时,C ++会自动为您创建一个typedef'符号(无论您是否同时定义变量)。有关与“第一次近似”一词相关的警告的相当完整的详细信息,请参阅下面的广泛评论。感谢所有帮助我澄清这一点的评论员。

答案 1 :(得分:4)

在第一种情况下,您要声明一个变量。在第二种,一种类型。我认为更好的方法是:

typedef struct tag_x {
    char a;
    int b;
} x;

答案 2 :(得分:4)

第一个定义名为'x'的变量,其类型是未命名的结构。

第二个定义了一个名为x的结构,但没有定义任何使用它的结构。

答案 3 :(得分:2)

第一个相当于

struct unnamed_struct {  char a;    int b;};
unnamed_struct x;

只是结构类型没有名称。

答案 4 :(得分:2)

两者做了不同的事情:

struct {
   char a;
   int b;
} x;

声明x

类型的变量struct { char a; int b; }
struct x {
   char a;
   int b;
};

声明类型 struct x。要获取该类型的变量,您稍后需要执行此操作:

struct x x = {0};
x x = {0}; // C++ only

第二个更常见,因为它可以使声明更短,特别是如果你必须改变你的结构。如果您再也不需要该结构并且不想污染您的命名空间,则使用第一个。所以基本上没有。