struct {
char a;
int b;
} x;
为什么要定义这样的结构而不是仅仅将其声明为:
struct x {
char a;
int b;
};
答案 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
第二个更常见,因为它可以使声明更短,特别是如果你必须改变你的结构。如果您再也不需要该结构并且不想污染您的命名空间,则使用第一个。所以基本上没有。