gpt4 book ai didi

c++ - "anonymous structs"是标准的吗?而且,真的,他们*是*什么?

转载 作者:IT老高 更新时间:2023-10-28 13:58:29 24 4
gpt4 key购买 nike

MSDN reckons匿名结构在 C++ 中是非标准的:

A Microsoft C extension allows you to declare a structure variable within another structure without giving it a name. These nested structures are called anonymous structures. C++ does not allow anonymous structures.

You can access the members of an anonymous structure as if they were members in the containing structure.

@K-ballo agrees .

有人告诉我,此功能不一定与创建一个未命名的结构相同,但我看不出标准措辞方面的区别。

C++11 说:

[C++11: 9/1]: [..] A class-specifier whose class-head omits the class-head-name defines an unnamed class.

并为缺少名称的类型定义提供完整的语法结构。

C++03 缺少这种明确的措辞,但同样表明 identifier在类型定义中是可选的,并且引用 9.4.2/5 中的“未命名类”和 3.5/4 .

  • 那么 MSDN 是不是错了,这些东西都是完全标准的?
  • 或者,在“未命名的结构/类”和用作成员时,我是否遗漏了一些微妙之处,以防止它们被此 C++03/C++11 功能覆盖?
  • 我是否遗漏了“未命名结构”和“匿名结构”之间的一些根本区别?在我看来,它们就像同义词。

最佳答案

所有的标准文本都是指创建一个“未命名的结构”:

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 内的未命名结构,还会自动为您提供各种“匿名成员”,这使得在父对象中可访问的成员。

正是这个功能是非标准的。海合会 does support it ,Visual C++ 也是如此。 Windows API header 默认使用此功能,但您可以通过在包含 Windows header 文件之前添加 #define NONAMELESSUNION 来指定不需要它。

与执行类似操作的“匿名 union ”的标准功能进行比较:

struct Foo {
union {
int hi;
int bye;
}; // <--- no member name!
};

int main()
{
Foo f;
f.hi = 3;
}

看来,尽管术语“未命名”指的是类型(即“类”或“结构”)本身,但术语“匿名”指的是实际实例化的成员(使用“结构”的旧含义,更接近“某些 structy 类型的对象”)。这可能是您最初困惑的根源。

关于c++ - "anonymous structs"是标准的吗?而且,真的,他们*是*什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14248044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com