То, что у вас есть, неплохо, но в моей статье Подводные камни конвертации Я описываю немного более приятную технику для обработки такого объединения без имени:
param_union_p = ^param_union_t;
param_union_t = packed record
case Integer of
0: (param_float: Single);
1: (param_int32: Int32);
2: (param_uint32: UInt32; // add the members after the union to the largest branch.
&type: UInt8);
3: (param_int16: Int16);
...
...
end;
PParamUnion = ^TParamUnion;
TParamUnion = param_union_t;
Вместоветвь UInt32
также может быть добавлена к ветке Single
или Int32
того же размера.Это все равно приведет к тому же макету памяти, что и структура в C, с &type
по смещению 4 и размером записи 5, и это все, что имеет значение.Просто взгляните на диаграмму в статье для уточнения:
Таким образом, нет необходимости присваивать соединительной части свой собственный тип исобственное имя.Если вы не доверяете «уловке», используйте код , который я дал в той же статье , чтобы проверить смещения в C и в Delphi.
Borland и Embarcadero, а также Delphi-JEDI, используйте (d) тот же трюк для перевода анонимных союзов, и записи Delphi TVarRec
(для array of const
параметров) и TVarType
(для вариантов) также создаются таким образом.