type
IntRec1 = packed record
ID: ShortString;
case Integer of
3: (
Param: Integer);
5: (
ParamLo: Word;
ParamHi: Byte);
end;
IntRec2 = packed record
ID: ShortString;
case Char of
'c': (
Param: Integer);
'e': (
ParamLo: Word;
ParamHi: Byte);
end;
IntRec3 = packed record
ID: ShortString;
case Boolean of
True: (
Param: Integer);
False: (
ParamLo: Word;
ParamHi: Byte);
end;
1、以上Param和ParamLo/ParamHi是變體結構的兩個不同分支,可以用Param域直接訪問該變體的整數部分(Integer),也可以用ParamLo域訪問該整數部分的低16位(Word),用ParamH域i訪問高8位(Byte)。
2、變體結構的大小,取決於占空間最大的分支,如本題中Integer(4字節)>Word(2字節)+Byte(1字節),因此本題三個變體結構大小均為256+4=260字節。
3、case後面的類型與分支標識的類型保持壹致就行了,分支標識隨便寫什麽都行(Integer與3、5,Char與'c'、'e',Boolean與True、False)。以上三種聲明方法都聲明的同壹種類型。
4、為了能精確訪問變體結構的域,壹般要加packed關鍵字,防止編譯器自動對齊。
5、變體結構在日常編程中用的不多,它大量使用在對Windows API的翻譯中。