C11支持匿名结构,如下所示:
struct Foo
{
struct
{
size_t x, y;
};
};
struct Foo f;
f.x = 17;
f.y = 42;
基本上,这样的struct
的成员被视为封闭的struct
或union
的成员(递归地,如果封闭结构本身是匿名的)。
C ++ 11的理由是什么,还包括匿名结构?当然,它们只是非常有用(主要是在工会内部,以消除struct
的标识符的类型)。但它们似乎是对规范的明显补充(以及已经由许多编译器实现的规范),它们肯定必须经过讨论,至少是为了保持与C11标准的兼容性。那么他们为什么不加入?
答案 0 :(得分:43)
随着两种语言的发展,在C ++和C之间保持兼容性的努力很少。请注意,自1999年以来,可变长度堆栈数组已在C中,但未包含在C ++ 11中。虽然他们通常不会引入相互矛盾的东西,但C ++委员会并没有完全反过来确保C ++ 11与C89之外的C版本兼容。
此外,这个功能在C ++中会相当复杂,因为struct
只不过是class
。一个匿名的struct / class应该具有常规struct / class的所有功能,是吗?否则,有什么意义呢?
构建无名struct
意味着什么?你会如何定义构造函数?简单的事情:
struct Foo
{
struct
{
size_t &x;
};
};
根本不可能,因为内部struct
没有构造函数。并且没有办法指定一个。 struct
无法构建其中struct
的成员。
对于这样的事情:
struct Foo
{
size_t outer;
struct
{
void SomeFunc();
size_t x;
};
};
this
指针SomeFunc
得到什么? this
的类型是什么,无名和未命名类型?你怎么在结构之外定义SomeFunc
? SomeFunc
的名称不能为Foo::SomeFunc
,因为SomeFunc
位于内部范围内。
对于C ++来说,处理它太复杂了。当然不值得为此添加复杂性而烦恼。
答案 1 :(得分:3)
扮演魔鬼的拥护者 - 经常使用类和结构声明来包装特定于类的声明。
typedef struct {
} name;
因此应该是允许的。
因此
struct {
}
应该也是。
但是,如果我们将此视为类内部命名空间中的声明,则无法访问结构内部。
因为C语言中的struct!=名称空间,C可以构成通过周围结构访问匿名结构的规则。
对于允许这样做的C ++,这种情况需要特殊情况,这会使名称解析复杂化。
当然,扮演魔鬼的魔鬼的拥护者--C实际上是这样做的。它为名称解析添加了额外的级别 - 如果您在stuct中找不到该名称,请检查该结构的匿名成员。这有点神奇,我可以看到C ++委员会成员觉得很烦人。
它也引发了一些问题 - 如果可以通过其父类访问匿名结构,那么名称空间中的匿名结构会怎么样。
当然,如果你真的想知道,只要问Stroustrup - 他回复电子邮件。