5

参考までに:offsetofマクロ (!) はstruct、指定された構造体のデータ型とメンバーを引数として取り、構造体の先頭を基準とした、指定されたメンバーの整数オフセットを返します。詳細な概要と参考文献を参照してください

ジェネリックの背後にあるロジックは非常に単純で、Delphi で簡単に(多かれ少なかれ)offsetof再現できます(文字通り簡単に、事前に宣言されたポインター型の要件を排除すると、基本的なインライン式になります。参照と逆参照の交換に関する 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 に答える