avp Asked:2020-11-30 02:24:27 +0000 UTC2020-11-30 02:24:27 +0000 UTC 2020-11-30 02:24:27 +0000 UTC C++ 中的匿名类和未命名类有什么区别? 772 这个问题的后续问题以澄清答案 c++ 1 个回答 Voted Best Answer Vlad from Moscow 2020-11-30T02:37:52Z2020-11-30T02:37:52Z 要回答这个问题,首先要翻开C语言标准,其中引入了匿名结构和匿名联合的概念。 在C 2011标准中,匿名结构和匿名联合定义如下(6.7.2.1结构和联合说明符) 13没有标签的结构类型 的未命名成员称为匿名结构;没有标签的联合类型的未命名成员称为匿名联合。匿名结构或联合的成员被视为包含结构或联合的成员。如果包含的结构或联合也是匿名的,则递归适用。 从这个定义可以看出,并不是每个未命名的结构或未命名的联合都是匿名的。只有作为其他结构或联合成员的未命名结构和未命名联合才是匿名的。 structC++中没有匿名类,即用or关键字声明的类class,但是有匿名联合,定义如下(C++标准,9.5节联合) 5 形式的联合 union { member-specification } ; 称为匿名联合;它定义了一个未命名类型的未命名对象。匿名联合的成员规范只能定义非静态数据成员。[ 注意:嵌套类型和函数不能在匿名联合中声明。--end note ] 匿名联合成员的名称应与声明匿名联合的范围内的任何其他实体的名称不同。出于名称查找的目的,在匿名联合定义之后,匿名联合的成员被认为是在声明匿名联合的范围内定义的。[例子: void f() { union { int a; const char* p; }; a = 1; p = "Jennifer"; } 这里 a 和 p 像普通(非成员)变量一样使用,但因为它们是联合成员,所以它们具有相同的地址。--结束示例] 从这个定义可以看出,C++中匿名联合的概念与C中匿名联合的相应定义不同。在C++中,可以在任何结构或联合之外声明匿名联合。 对这个问题更详细感兴趣的也可以查看我在isocpp.org上开的topic
要回答这个问题,首先要翻开C语言标准,其中引入了匿名结构和匿名联合的概念。
在C 2011标准中,匿名结构和匿名联合定义如下(6.7.2.1结构和联合说明符)
从这个定义可以看出,并不是每个未命名的结构或未命名的联合都是匿名的。只有作为其他结构或联合成员的未命名结构和未命名联合才是匿名的。
structC++中没有匿名类,即用or关键字声明的类class,但是有匿名联合,定义如下(C++标准,9.5节联合)从这个定义可以看出,C++中匿名联合的概念与C中匿名联合的相应定义不同。在C++中,可以在任何结构或联合之外声明匿名联合。
对这个问题更详细感兴趣的也可以查看我在isocpp.org上开的topic