首页 > 解决方案 > Ada 重叠标签字段

问题描述

这是我的类型:

package MyPackage is
    Type T_MyType is record
        Field1 : Uint16;
        Field2 : Uint32;
        Field3 : Uint8;
        Field4 : Uint8;
    end record;
private
    for T_MyType'Alignment use 4;
    for T_MyType'Size use 64;
    for T_MyType use record
        Field1 at 16#00# range 0 .. 15;
        Field2 at 16#02# range 0 .. 31;
        Field3 at 16#06# range 0 .. 7;
        Field4 at 16#06# range 8 .. 15:
    end record
end package

我没有错误,但是如果我将类型更改Type T_MyType is tagged record为第一行,则会出现错误:

组件与“T_MyType”的标签字段重叠

标记记录是否有隐藏字段?如何使用标记记录保存我的地址?

标签: recordada

解决方案


假设您使用的是 GNAT,GNAT RM 的这一章是相关的:

标记类型的标记字段总是在记录的开头占据一个地址大小的字段。任何组件子句都不得尝试覆盖此标记。

所以你需要为标签字段保存存储空间,像这样:

-- Standard'Address_Size is GNAT-specific and needed here since
-- System.Address'Size is not static. This length is in storage units.
Tag_Length : constant := Standard'Address_Size / System.Storage_Unit;

for T_MyType'Size use Standard'Address_Size + 64;
for T_MyType use record
   Field1 at Tag_Length + 16#00# range 0..15;
   Field2 at Tag_Length + 16#02# range 0..31;
   Field3 at Tag_Length + 16#06# range 0..7;
   Field4 at Tag_Length + 16#06# range 8..15;
end record;

推荐阅读