现在的位置: 首页 > 综合 > 正文

D语言中的结构和联合

2013年10月08日 ⁄ 综合 ⁄ 共 795字 ⁄ 字号 评论关闭
文章目录

结构 & 联合

	聚集声明:
		标记 { 声明定义 }
		标记 标志符 { 声明定义 }
		标记 标志符 ;

	标记:
		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			要对齐到的边界值

抱歉!评论已关闭.