结构 & 联合
聚集声明 :
标记 { 声明定义 }
标记 标志符 { 声明定义 }
标记 标志符 ;
标记 :
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 要对齐到的边界值