C 的 Pascal 等效项union
称为变体记录。
一个记录类型可以有一个变体部分,它看起来像一个case
语句。变体部分必须跟在记录声明中的其他字段之后。
要声明具有变体部分的记录类型,请使用以下语法:
type recordTypeName = record
fieldList1: type1;
...
fieldListn: typen;
case tag: ordinalType of
constantList1: (variant1);
...
constantListn: (variantn);
end;
声明的第一部分——直到保留字大小写——与标准记录类型的相同。声明的其余部分——从大小写到可选的最后分号——称为变体部分。在变体部分,
其中每个fieldList是一个有效的标识符或以逗号分隔的标识符列表,每个类型表示一个类型,最后的分号是可选的。类型不能是长字符串、动态数组、变体(即Variant类型)或接口,也不能是包含长字符串、动态数组、变体或接口的结构化类型;但它们可以是指向这些类型的指针。
具有变体部分的记录在语法上很复杂,但在语义上却看似简单。记录的变体部分包含多个变体,它们共享内存中的相同空间。您可以随时读取或写入任何变体的任何字段;但是,如果您先写入一个变体中的字段,然后再写入另一个变体中的字段,则可能会覆盖您自己的数据。该标签(如果有的话)作为记录的非变体部分中的一个额外字段(类型为ordinalType )。
至于其余的,这很常规:LONGLONG
是一个 64 位整数,并且UCHAR
是unsigned char
, 或AnsiChar
在 Delphi 中。
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
。当然,这有点难说,因为 C 与 Pascal 不同,没有单独的类型Byte
和AnsiChar
。但是这些数组在我看来好像它们会被当作文本来阅读,所以我的猜测是这AnsiChar
会更合适。