Show/Hide Toolbars

XSharp

注意此命令仅用于 VO 和 Vulcan 方言。

用途

声明一个 unino 实体及其成员名称。

语法

 [Modifiers] UNION <idUnion> [ALIGN 1|2|4|8]

 MEMBER <idVarList> AS | IS <idType> [ ,…]

 MEMBER DIM <ArraySpec> [ ,…] AS | IS <idType> [ ,…]

 [END UNION]

 

注:为方便起见,MEMBER 语句使用了两个语法。 如果每个定义之间用逗号隔开,则可以使用单个 MEMBER 语句声明变量和标度数组。

参数

Modifiers一个可选的修饰符列表,用于指定主体的可见性或范围,例如:PUBLIC, STATIC, INTERNAL, EXPORT 和 UNSAFE.

 

<idUnion>union 的有效标识符名称。 union 是一个实体,与其他实体共享相同的名称空间。 这就意味着不可能存在同名的 union 和常量。

 

MEMBER声明一个或多个 union 成员变量或标度数组。 您可以在不同行中指定多个 MEMBER 声明。

 

<idVarList>以逗号分隔的 union 成员变量标识符名称列表。

 

DIM <ArraySpec>作为 union 成员使用的有维数组的规格。 <ArraySpec> 是以下格式之一:
<idArray>[<nElements>, <nElements>, <nElements>]
<idArray>[<nElements>],[<nElements>], [<nElements>]
除第一个 nElements 之外,其余都是可选的。
 
<nElements> 定义数组特定维数中的元素个数。 维数由指定 <nElements> 参数的个数决定。
 
<nElements> 可以是字面数字表示或只涉及运算符、字面数字和 DEFINE 常量的简单数字表达式;但不允许使用更复杂的表达式(如函数调用)。

 

AS <idType>指定所声明变量的数据类型(称为强类型)。 对于 DIM 数组,声明所有数组元素的数据类型。 所有联合成员都需要 AS <idType>。
 
有关 <idType> 的有效值列表,请参阅 CLASS 。 请注意,union 不支持以下数据类型,因为它们是需要垃圾回收的动态类型:

oARRAY

oFLOAT

oOBJECT

o<idClass>

oSTRING

oUSUAL

o

 

IS <idType>指定一个 union 数据类型,在该 union 数据类型中,保存 union 数据所需的内存是在堆栈中分配的(也就是说,<idUnion> 是唯一允许使用 IS 关键字的 <idType> 类型)。

 

ALIGN 1|2|4|8指定结构体的内存对齐方式。默认值为 4,这意味着所有成员都以 DWORD 边界对齐,因为这在 32 位平台上性能最佳,也是大多数 C/C++ 编译器的默认对齐方式。如果需要与定义了不同对齐方式(C/C++ 头文件中的 #pragma 包)的 C/C++ 结构相匹配,可能需要更改对齐方式。
 
注意:C/C++ 编译器的默认对齐方式也是 4,除非结构包含双倍(XSharp 中的 REAL8)。在这种情况下,C/C++ 编译器会使用 8 的对齐方式。XSharp 不会自动选择 8 的对齐方式,因此在这种情况下,必须在结构体中添加 ALIGN 8。

描述

UNION 与 STRUCTURE 类似,但所有成员都从偏移量 0 (0) 开始。 换句话说,给一个 union 成员赋值会影响其他所有 union 成员。 由于 union 的大小等于最大成员的大小,因此改变一个成员将改变所有其他成员,因为它们占用相同的内存。

 

您可以使用 UNION 语句标记 union 实体定义的开始,然后使用一个或多个 MEMBER 语句定义 union 的外观。

示例

下面是一个转换示例:

UNION wb ALIGN 1
 MEMBER w AS WORD
 BYTE bLo AS BYTE
 BYTE bHi AS BYTE
 
FUNCTION x
LOCAL u IS wb
 
u.w := 0x1234
 
? u.bLo // 52 (=0x34)
? u.bHi // 18 (=0x12)

参见

STRUCTURE