不,那不是无名成员。
一个例子是:
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 的不同之处在于,在给定type
成员的值的情况下,没有强制执行哪个变体处于活动状态的机制;这对你来说是 C。)
在您的示例中,AToW
是您之前定义的结构类型的 typedef。你不被允许裸露
AToW;
在结构定义的中间,你不能有一个裸露的
int;
C11 添加了在另一个结构中定义嵌套匿名结构的能力,但只能通过在该点定义新的匿名结构类型。您不能拥有先前定义的类型的匿名结构成员。语言可以被定义为允许它,并且语义(我认为)会相当简单——但是定义两种不同的方式来做同样的事情并没有多大意义。(对于上面的“结构”,请阅读“结构或联合”。)
引用N1570 草案(非常接近发布的 2011 ISO C 标准),第 6.7.2.1 节第 13 段:
类型说明符是没有标记的结构说明符的未命名成员称为匿名结构;类型说明符是没有标记的联合说明符的未命名成员称为匿名联合。匿名结构或联合的成员被视为包含结构或联合的成员。如果包含结构或联合也是匿名的,这将递归地应用。
结构说明符由关键字组成struct
,后跟一个可选标识符(标记,在这种情况下省略),后跟一系列用 and 括起来的{
声明}
。在您的情况下,AToW
是类型名称,而不是结构说明符,因此它不能用于定义匿名结构。