估计匿名结构在C++中是不标准的:
Microsoft扩展允许您在另一个结构中声明结构变量,而不给它命名。这些嵌套结构称为匿名结构。C++不允许匿名结构。 您可以访问匿名结构的成员,就像它们是包含结构中的成员一样。
同意。
有人告诉我,这个特性不一定等同于创建一个未命名的结构,但我看不到标准措辞的区别。
C++11说:
[C++11: 9/1]:..类说明符,其类头省略类头名定义未命名的类.
并为缺少名称的类型定义提供一个完整的语法结构。
C++03缺乏这种明确的措辞,但类似地指出,类型定义中的identifier是可选的,并在9.4.2/5和3.5/4中引用“未命名的类”。
发布于 2013-01-09 23:07:17
微软称之为匿名结构的东西是不标准的。未命名的结构只是一个没有名称的普通结构。除非您还定义了该类型的对象,否则您无法使用该对象做太多事情:
struct {
int i;
double d;
} my_object;
my_object.d = 2.3;匿名unions是该标准的一部分,它们的行为可以通过阅读匿名结构的微软的描述来实现:
union {
int i;
double d;
};
d = 2.3;发布于 2013-01-09 23:09:41
关于匿名工会的标准讨论: 9.5/5
形式的结合 联合{成员-规格}; 称为匿名联合;它定义未命名类型的未命名对象。匿名联盟的成员规范只应定义非静态数据成员。注意:嵌套类型和函数不能在匿名联合中声明。-end注意:匿名工会成员的姓名应与宣布匿名工会的范围内的任何其他实体的名称不同。为了查找名称,在匿名联合定义之后,匿名联合的成员被视为已在声明匿名联合的范围内定义。示例: { union { int a;const char* p;};a= 1;p= "Jennifer";} 在这里,a和p像普通(非成员)变量一样使用,但是由于它们是联合成员,所以它们具有相同的地址。-end实例
微软提到的匿名结构是unions的这个特性,但应用于structs。不只是一个未命名的定义,重要的是要注意,匿名联合/结构的节点被认为是在声明匿名联合/结构的范围中定义的。
据我所知,标准中没有针对未命名结构的此类行为。请注意,在所引用的示例中,您可以实现其他不可能实现的任务,比如为堆栈中的变量共享存储,而匿名结构则不会给表带来任何新的东西。
https://stackoverflow.com/questions/14248044
复制相似问题