5

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

泛型背后的逻辑offsetof非常简单,可以轻松(或多或少)在 Delphi 中重现(字面意思是轻松,消除预声明的指针类型要求使其成为基本的内联表达式,请参阅 David Heffernan 的关于交换引用和取消引用的回答评论运算符)作为就地代码。但是,我认为绝对没有办法将就地代码解决方案转换为可重用函数。我们真的可以这样做吗?

4

2 回答 2

16

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

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

NativeUInt(@TMyRecord(nil^).MyField)

但这不像干净

offsetof(struct MyStruct, MyField)
于 2013-09-13T13:16:12.527 回答
1

为了扩展@DavidHeffernan 的回答和@UliGerhardt 的评论,以下是我们现在使用、测试和使用的内容:

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;
于 2016-06-23T07:31:01.650 回答