struct {
char a;
int b;
} x;
为什么要像这样定义一个结构体,而不是直接声明它呢:
struct x {
char a;
int b;
};
x
可以是那种类型——严格来说,如果你定义了另一个与之相同的结构体 y
,它将成为另一种类型。因此,当您永远不需要任何其他相同类型的变量时,可以使用此类型。请注意,您不能将任何东西强制转换为该类型,声明或定义具有使用该类型的原型的函数,甚至动态分配该类型的变量 - 没有名称用于该类型。struct x
,然后可以使用该类型创建所需数量的变量。这当然是更常见的情况。通常与 typedef
结合使用或关联。typedef struct x
{
char a;
int b;
} x;
通常,您应该使用更具信息性的标签名称和类型名称。对于结构体标记(第一个“x”)和typedef名称(第二个“x”),使用相同的名称是完全合法和安全的。
就第一近似而言,当您使用普通的“struct x {...};”符号时(无论是否同时定义变量),C++会自动为您“创建typedef”。有关与术语“第一近似”相关的所有注意事项的详细信息,请参见下面的广泛评论。感谢所有帮助我澄清这一点的评论人员。
typedef struct tag_x {
char a;
int b;
} x;
tag_x
和 x
来引用同一件事情。结构体、联合体和枚举标签位于与定义 typedef 的普通标识符命名空间不同的命名空间中,因此不存在冲突 - C++ 会自动创建“typedef struct x { ... } x;”。 - Jonathan Leffler第一个定义了一个名为“x”的变量,其类型是一个未命名的结构。
第二个定义了一个名为x的结构体,但没有定义任何使用它的内容。
struct unnamed_struct { char a; int b;};
unnamed_struct x;
只是结构体类型没有名称。
struct {
char a;
int b;
} x;
struct { char a; int b; }
的变量x
。struct x {
char a;
int b;
};
声明一个名为struct x
的类型。要获取该类型的变量,您需要稍后执行以下操作:
struct x x = {0};
x x = {0}; // C++ only
namespace z { struct { ... } x; }
,然后引用它using z::x;
,例如?如果是这样,为什么?如果不是,请澄清一下。 - Jonathan Lefflerx
。原因是:x
将具有外部链接性,但其类型没有链接性。为了使声明有效,如果x
具有链接性,则其类型必须具有链接性。但是,如果x
是类成员或局部变量,则它没有链接性,因此其类型也不需要具有链接性(这个限制是由于实现中的名称重整困难而存在的,如果我没记错的话)。 - Johannes Schaub - litb