供参考:offsetof
宏(!)将struct
数据类型和指定结构的成员作为参数,并返回给定成员相对于结构开头的整数偏移量。请参阅detailed overview and references。
泛型offsetof
背后的逻辑非常简单,可以在Delphi中轻松地再现(或多或少)(字面上很容易,取消预先指定的指针类型要求使它成为一个基本内联表达式,请参阅David Heffernan的answer和comment about swapping引用和解除引用运算符)作为就地代码。但是,我认为绝对没有办法将就地代码解决方案转换为可重用的功能。我们真的能这样做吗?
答案 0 :(得分:15)
如果没有预处理器或内置函数,就无法像offsetof
宏一样干净利落地完成任务。 offsetof
能够如此干净地完成它的方式是预处理器完成工作。事实上,有些编译器将它作为内置实现,但这不是重点。 Delphi没有预处理器,也没有内置offsetof
。
我所知道的最干净的解决方案是这样的:
NativeUInt(@TMyRecord(nil^).MyField)
但这不像是干净的
offsetof(struct MyStruct, MyField)
答案 1 :(得分:1)