"anonymous structs"标准吗?而且,真的,他们*是什么*?
Are "anonymous structs" standard? And, really, what *are* they?
MSDN认为匿名结构在c++中是非标准的:
Microsoft C扩展允许你声明一个结构变量在另一个结构中,不给它命名。这些嵌套结构被称为匿名结构。c++不允许匿名结构。
可以像访问匿名结构的成员一样访问它们
@K-ballo 。
我被告知这个特性并不一定等同于仅仅创建一个未命名的结构体,但是我看不出标准措辞上的区别。
c++ 11说:
[C++11: 9/1]
: […]class-head省略class-head-name的类说明符定义了未命名的类。
并为缺少名称的类型定义提供完整的语法结构。
c++ 03缺乏这种明确的措辞,但同样表明类型定义中的identifier
是可选的,并在9.4.2/5
和3.5/4
中引用了"未命名类"。
- 所以MSDN是错的,这些东西都是完全标准的吗?
- 或者在"未命名的结构/类"之间缺少一些微妙之处,并且当用作阻止它们被此c++ 03/c++ 11功能覆盖的成员时相同?
- 我错过了"未命名结构"answers"匿名结构"之间的一些根本区别吗?在我看来,它们就像是同义词。
所有标准文本都提到创建一个"未命名结构体":
struct {
int hi;
int bye;
};
只是一个友好的类型,没有可访问的名称。
在标准方法中,它可以像这样实例化为成员:
struct Foo {
struct {
int hi;
int bye;
} bar;
};
int main()
{
Foo f;
f.bar.hi = 3;
}
但是"匿名结构"有微妙的不同—这是一个"未命名结构"和你在父对象中神奇地从中获得成员的事实的结合:
struct Foo {
struct {
int hi;
int bye;
}; // <--- no member name!
};
int main()
{
Foo f;
f.hi = 3;
}
与直觉†相反,这不仅创建了一个嵌套在Foo
中的未命名结构,而且还自动为您提供了各种"匿名成员",使成员可以在父对象中访问。
正是这个功能是非标准的。GCC 支持它,Visual c++也是如此。Windows API头文件默认使用此功能,但您可以通过在包含Windows头文件之前添加#define NONAMELESSUNION
来指定不需要它。
与"匿名联合"的标准功能比较,它们做类似的事情:
struct Foo {
union {
int hi;
int bye;
}; // <--- no member name!
};
int main()
{
Foo f;
f.hi = 3;
}
†似乎,尽管术语"未命名"指的是类型(即:"类"或"结构")本身,术语"匿名"指的是实际实例化的成员(使用"结构"的旧含义,更接近于"某种 struct
y类型的对象")。
微软称之为匿名结构的东西是不标准的。未命名结构体只是一个没有名称的普通结构体。除非你也定义了一个这种类型的对象,否则你就无能为力了:
struct {
int i;
double d;
} my_object;
my_object.d = 2.3;
匿名联合是标准的一部分,它们具有您在阅读微软对其匿名结构的描述时所期望的行为:
union {
int i;
double d;
};
d = 2.3;
标准讨论匿名联合: [9.5]/5
Microsoft讨论的匿名结构是形式为
的并集union { member-specification } ;
称为匿名联合;它定义了未命名类型的未命名对象。匿名联合的成员规范只能定义非静态数据成员。[注意:嵌套类型和函数不能在匿名联合中声明。]匿名联合的成员名称应与声明匿名联合的范围内任何其他实体的名称不同。出于名称查找的目的,在匿名联合定义之后,匿名联合的成员被认为是在声明匿名联合的作用域中定义的。(例子:
void f() { union { int a; const char* p; }; a = 1; p = "Jennifer"; }
这里a和p像普通(非成员)变量一样使用,但由于它们是联合成员,所以它们具有相同的地址。-end example]
unions
的这个特性,但应用于structs
。不只是一个未命名的定义,重要的是要注意,匿名联合/结构的成员被认为是在声明匿名联合/结构的作用域中定义的。
据我所知,在标准中没有未命名结构的这种行为。请注意,在引用的示例中,您如何实现其他情况下不可能实现的事情,例如为堆栈中的变量共享存储,而匿名结构没有给表带来任何新内容。
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- 我怎样才能有 2 个程序并让用户选择他们想要使用的程序?
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 显示 C++ 中"anonymous"变量创建的警告
- 全局静态生存期?他们会让你的程序崩溃吗?
- 如何正确消除继承类型定义的歧义?以及如何简化他们的创作?
- C++:告诉用户输入 A、B 或 C,但如果他们输入不同的字符怎么办?
- 如何通过 CMake 使用他们的 SHA256 哈希下载提升?
- 类的私有成员在我的类实例化期间更改,即使他们不应该
- 我如何一遍又一遍地向用户提问,直到他们输入正确的值字段?
- 您可以声明会员功能并使他们做不同的事情吗?
- 我想在C++中安排结构.通过他们的标记以及他们的其他属性
- Visual Studio在发布模式下构建,但用户收到消息说他们需要调试文件
- SFML OpenGL:如何同时与他们一起工作
- 复制构造函数和运算符"="他们没有打印列表 l 的副本
- 使用std ::函数时运行时异常.他们为什么不指向有效的代码
- "anonymous structs"标准吗?而且,真的,他们*是什么*?