C union
的帕斯卡当量被称为variant record。
记录类型可以有一个变体部分,它看起来像一个情况 声明。变体部分必须遵循记录 声明中的其他字段。
要使用的变体部分声明的记录类型,使用以下 语法:
type recordTypeName = record
fieldList1: type1;
...
fieldListn: typen;
case tag: ordinalType of
constantList1: (variant1);
...
constantListn: (variantn);
end;
声明的第一部分 - 高达保留字情况 - 是 相同的一个标准的记录类型。 声明的其余部分 - 从case到可选的最终分号 - 被称为 变体部分。在变体部分中,
其中每个fieldList中是有效的标识符或 标识符逗号分隔的列表,其中每个类型表示一种类型,并且最终分号是 可选的。类型不能是长字符串,动态数组,变体 (即变体类型)或接口,也不能是包含长字符串,动态数组,变体或接口的 类型的结构体;但它们可以是指向这些类型的指针。
变体部分的记录在语法上是复杂的,但是在语义上看起来很简单 。记录的变体部分包含 几个在内存中共享相同空间的变体。您可以在任何时间阅读或写入任何变体的任何字段;但如果您在一个变体中写入 字段,然后写入另一个变体中的字段,则可能会覆盖您自己的数据。该标记(如果存在的话)在 记录的非变体部分中起到 附加字段(类型ordinalType)的作用。
至于其他的,这是很常规:LONGLONG
是一个64位整数,UCHAR
是unsigned char
,或在Delphi AnsiChar
。
type
TFileObjectIDInformation = record
FileReference: Int64;
ObjectID: array[0..15] of AnsiChar;
case Integer of
0:
(
BirthVolumeId: array[0..15] of AnsiChar;
BirthObjectId: array[0..15] of AnsiChar;
DomainId: array[0..15] of AnsiChar;
);
1:
(ExtendedInfo: array[0..47] of AnsiChar);
end;
这有可能是Byte
可能比AnsiChar
更合适。当然有点难以分辨,因为与Pascal不同,C不具有Byte
和AnsiChar
的单独类型。但是这些数组看起来好像他们会被读作文本,所以我猜想AnsiChar
会更合适。
1为 “C联盟” 的说明) –
@David_Heffernan,感谢。 – Astaroth
@Astaroth完成。谢谢。我总是感到困惑! –