结构 & 联合
聚集声明: 标记 { 声明定义 } 标记 标志符 { 声明定义 } 标记 标志符 ; 标记: struct union
AggregateDeclaration: Tag { DeclDefs } Tag Identifier { DeclDefs } Tag Identifier ; Tag: struct union
它们同在 C 中的结构基本一样,除了以下一些例外:
- 没有位域
- 可以显式指定对齐
- 没有单独的标记名字空间 —— 标记名并入当前的作用域
- 不允许如下面这样的声明:
struct ABC x;
应该使用:
ABC x;
- 匿名结构/联合可以作为其他结构/联合的成员存在
- 可以为成员提供默认初始值
- 可以拥有成员函数和静态成员
结构和联合是简单的数据聚集,是同硬件或者外部类型通信的数据结构。外部类型可以由操作系统 API 定义,或者由文件格式定义。面向对象特征是由类提供的。
结构的静态初始化
如果不提供初始值,静态结构成员会被默认地初始化为成员类型的初始值。如果提供了静态初始值,成员会按照这样的语法初始化:成员名,冒号,表达式。成员可以按照任意顺序初始化。没有出现在初始化列表中的成员会被默认值初始化。
struct X { int a; int b; int c; int d = 7;} static X x = { a:1, b:2}; // c 被设置为 0, d 为 7 static X z = { c:4, b:5, a:2 , d:5}; // z.a = 2, z.b = 5, z.c = 4, z.d = 5
C 风格的初始化,依赖于结构声明中的成员的顺序,也是被支持的:
static X q = { 1, 2 }; // q.a = 1, q.b = 2, q.c = 0, q.d = 7
联合的静态初始化
联合需要显式地初始化。
union U { int a; double b; } static U u = { b : 5.0 }; // u.b = 5.0
如果联合的其他成员占用的存储空间更大,剩下的部分被初始化为零。
结构属性
.sizeof 以字节为单位的结构大小 .size 同 .sizeof 相同 .alignof 要对齐到的边界值