不,那不是一个未命名成员。
一个例子是:
struct outer {
int a;
struct {
int b;
int c;
};
int d;
};
包含成员 b
和 c
的内部结构是 struct outer
的一个 未命名成员。这个未命名成员的成员 b
和 c
被认为是包含结构的成员。
这可能比包含结构更有用,特别是可以用于定义类似 Pascal 或 Ada 变体记录的东西:
enum variant_type { t_int, t_double, t_pointer, t_pair };
struct variant {
enum variant_type type;
union {
int i;
double d;
void *p;
struct {
int x;
int y;
};
};
};
这使得您可以直接将
i
、
d
和
p
作为
struct variant
对象的成员进行引用,而不是为变量部分创建人工名称。如果某些变量需要多个成员,则可以在匿名联合体中嵌套匿名结构。
(与Pascal和Ada不同的是,在C语言中没有机制来强制执行给定
type
成员的值哪个变量处于活动状态;这就是C语言。)
在您的示例中,
AToW
是您之前定义的结构类型的typedef。您不允许有一个裸的
AToW;
在结构体定义中,不能像裸指针那样有任意数量的裸字段。
int;
C11增加了在另一个结构体内定义嵌套匿名结构的功能,但是只能通过在该点定义新的匿名结构类型来实现。您不能有以前定义的类型的匿名结构成员。语言本身可以允许这样做,并且语义(我认为)相当简单明了,但是定义两种不同的方式做同一件事情并没有太多意义。(对于上面的“struct”,请阅读“struct或union”。)
引用
N1570 draft(非常接近发布的2011 ISO C标准)第6.7.2.1段第13款:
未命名成员的类型说明符是具有无标记的结构说明符的结构体成员称为匿名结构;类型说明符为具有无标记的联合说明符的未命名成员称为匿名联合。匿名结构或联合的成员被视为包含结构或联合的成员。如果包含结构或联合也是匿名的,则递归应用此规则。
一个结构体说明符包含关键词
struct
,后跟可选的标识符(在本例中省略了标签),后跟用
{
和
}
括起来的一系列声明。在您的情况下,
AToW
是一个类型名称,不是一个结构体说明符,因此不能用于定义匿名结构体。
struct foo { ... } f;
- 这里“foo”就是标签。 - The Paramagnetic CroissantAToW
没有标签。 - Johannes Schaub - litb