供参考:offsetof
宏(!)将struct
数据类型和指定结构的成员作为参数,并返回给定成员相对于结构开头的整数偏移量。请参阅详细概述和参考资料。
泛型背后的逻辑offsetof
非常简单,可以轻松(或多或少)在 Delphi 中重现(字面意思是轻松,消除预声明的指针类型要求使其成为基本的内联表达式,请参阅 David Heffernan 的关于交换引用和取消引用的回答和评论运算符)作为就地代码。但是,我认为绝对没有办法将就地代码解决方案转换为可重用函数。我们真的可以这样做吗?
如果没有预处理器或内置函数,就无法像offsetof
宏那样干净利落。能够如此干净地做到这一点的方式offsetof
是预处理器完成工作。事实上,一些编译器将其实现为内置的,但这不是重点。Delphi 没有预处理器,也没有内置offsetof
.
我知道的最干净的解决方案是这样的:
NativeUInt(@TMyRecord(nil^).MyField)
但这不像干净
offsetof(struct MyStruct, MyField)
为了扩展@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;