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

Fre*_*ing 4 delphi struct

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

泛型背后的逻辑offsetof非常简单,可以轻松地在Delphi中复制(或多或少)(字面上很简单,取消预先指定的指针类型要求使其成为基本的内联表达式,请参阅David Heffernan 关于交换引用和解引用的答案评论运营商)作为就地代码.但是,我认为绝对没有办法将就地代码解决方案转换为可重用的功能.我们真的能这样做吗?

Dav*_*nan 15

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

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

NativeUInt(@TMyRecord(nil^).MyField)
Run Code Online (Sandbox Code Playgroud)

但这就像干净一样

offsetof(struct MyStruct, MyField)
Run Code Online (Sandbox Code Playgroud)

  • FWIW:如果你需要很多这些结构,你可以声明`const p = PMyRecord(nil)`并使用它像`Whatever(p ^ .MyField)`. (3认同)