C++中是否真的存在Anonymous class/struct(匿名类/结构体)?
你的理解完全符合C++标准的定义,目前很多中文技术资料确实混淆了「Unnamed(无名称)」和「Anonymous(匿名)」两个概念,二者的边界在标准里有明确规定:
1. Unnamed 类型(无名称类型)
指没有标识符作为类型名的类、结构体、联合体类型,和定义后是否跟随声明符无关。你给出的示例:
struct{ int x = 0; }a;
以及
union{ char unsigned red_; char unsigned green_; char unsigned blue_; long unsigned color_ = 255; } color;
都属于定义了Unnamed类型,同时声明了对应类型的对象,属于完全合法的C++语法。
2. Anonymous 联合体(匿名联合体)
是C++标准为联合体单独设计的特殊语法,刚好符合你提出的两个判定条件:
- 本身是Unnamed union类型
- 类型定义结束后没有跟随任何声明符
标准规定这种场景下会隐式创建一个该联合体类型的无名对象,它的所有成员会被注入到当前作用域,可以直接访问,不需要通过对象名调用:
// 匿名联合体,符合C++标准 union{ char unsigned red_; char unsigned green_; char unsigned blue_; long unsigned color_ = 255; }; green_ = 247; // 直接访问成员,合法
关于Anonymous class/struct的说明
你提到的「C标准不支持匿名类/结构体」的判断是完全正确的。C标准只给了union匿名语法的特殊支持,没有为struct和class设计对应的隐式对象创建规则。如果定义一个无名称的struct/class却不声明对应对象,这个类型完全没有办法被后续代码使用,没有任何实际意义,所以标准直接将这种写法判定为格式错误。
你推测的「不允许的原因是不会自动创建对应类型的对象」逻辑也完全成立。需要额外注意的是,部分C标准、或者GCC等编译器的非标准扩展支持匿名struct,但这不属于标准C的特性,跨平台的标准C代码不建议使用这类扩展。
内容的提问来源于stack exchange,提问作者Itachi Uchiwa
相关产品推荐
相关产品推荐

