我们可以在Delphi中实现ANSI C的`offsetof`吗?

时间:2013-09-13 13:01:34

标签: delphi struct

供参考:offsetof宏(!)将struct数据类型和指定结构的成员作为参数,并返回给定成员相对于结构开头的整数偏移量。请参阅detailed overview and references

泛型offsetof背后的逻辑非常简单,可以在Delphi中轻松地再现(或多或少)(字面上很容易,取消预先指定的指针类型要求使它成为一个基本内联表达式,请参阅David Heffernan的answercomment about swapping引用和解除引用运算符)作为就地代码。但是,我认为绝对没有办法将就地代码解决方案转换为可重用的功能。我们真的能这样做吗?

2 个答案:

答案 0 :(得分:15)

如果没有预处理器或内置函数,就无法像offsetof宏一样干净利落地完成任务。 offsetof能够如此干净地完成它的方式是预处理器完成工作。事实上,有些编译器将它作为内置实现,但这不是重点。 Delphi没有预处理器,也没有内置offsetof

我所知道的最干净的解决方案是这样的:

NativeUInt(@TMyRecord(nil^).MyField)

但这不像是干净的

offsetof(struct MyStruct, MyField)

答案 1 :(得分:1)

要扩展@ DavidHeffernan的answer和@ UliGerhardt的comment,这是我们现在使用,测试和使用的内容:

procedure foo;
type
  TPerson = record
    DOB: TDate;
    FirstName: string;
    LastName: string;
  end;
const
  Offset_TPerson: ^TPerson = nil;
begin
  writeln('OffsetOf FirstName = '+IntToStr(NativeUInt(@Offset_TPerson.FirstName)));
end;