记录组件偏移的位置属性

时间:2015-03-17 17:50:47

标签: ada

如何获取记录组件的字节偏移量?

来自Ada Programming/Attributes/'Position

  

'Position是记录类型组件属性。它表示组件从记录开头的地址偏移量。返回的值以存储单元表示,这是特定于机器的。

编译此代码:

with Ada.Integer_Text_IO;
use Ada.Integer_Text_IO;
procedure Main is
   type R is record
      I : Integer;
      F : Float;
   end record;
begin
   Put(R.I'Position); --9
   Put(R.F'Position); --10
end;

结果:

main.adb:9:08: invalid prefix in selected component "R"
main.adb:10:08: invalid prefix in selected component "R"

我不知道为什么我不能编译它?

  • R.I 的偏移量应为 0
  • R.F 的偏移量应为 Integer'Size / Storage_Unit

例如,等效地查看C ++ offsetof文档。

1 个答案:

答案 0 :(得分:2)

如果查看参考手册(RM 13.5.2),您会看到R.C'Position已定义

  

对于复合的组件C,非数组对象R

这意味着它不会像代码中那样为某个类型工作。您需要创建一个变量:

   Foo : R;
begin
   Put(Foo.I'Position); --9
   Put(Foo.F'Position); --10

所以wikibook中的例子似乎是错误的。