5

Embarcadero の docwiki ページLLVM ベースの Delphi Compilersには、Delphi XE8 でのいくつかの言語変更がリストされています。箇条書きの 1 つには次のように書かれています。

ポインタの使用は、LLVM ベースの Delphi コンパイラではサポートされていません。

これは実際にはどういう意味ですか?Delphi XE7 で機能していたポインター関連の機能のうち、Delphi XE8 では機能しなくなったものはどれですか? Embarcadero の Web サイトで、これに関する詳細な説明を見つけることができないようです。たとえば、より多くの情報が含まれていると言われているデスクトップからモバイルへの Delphi コードの移行ページには、「ポインタ」という言葉はありません。

4

1 に答える 1

6

ポインタの使用は、LLVM ベースの Delphi コンパイラではサポートされていません。

それはドキュメントのエラーでなければなりません。RTLを見てください。ポインターを使って太くしています。

たとえば、どうですかCompareMem。次のように定義されます。

function CompareMem(P1, P2: Pointer; Length: Integer): Boolean;

そして、実装は次のように実行されます。

function CompareMem(P1, P2: Pointer; Length: Integer): Boolean;
{$IF defined(POSIX)}
begin
  if Length <= 0 then
    Result := True
  else
    Result := memcmp(P1^, P2^, Length) = 0;
end;
{$ELSEIF defined(PUREPASCAL)}
....
{$ENDIF !PUREPASCAL}

このPOSIXコードは、モバイル ターゲットによって使用されます。

または、TObject次のようになります。

type
  TObject = class
  public
    constructor Create;
    procedure Free;
    procedure DisposeOf; {$IFNDEF AUTOREFCOUNT} inline; {$ENDIF}
    class function InitInstance(Instance: Pointer): TObject {$IFDEF AUTOREFCOUNT} unsafe {$ENDIF};
    procedure CleanupInstance;
    function ClassType: TClass; inline;
    class function ClassName: string;
    class function ClassNameIs(const Name: string): Boolean;
    class function ClassParent: TClass;
    class function ClassInfo: Pointer; inline;
    class function InstanceSize: Integer; inline;
    class function InheritsFrom(AClass: TClass): Boolean;
    class function MethodAddress(const Name: _ShortStr): Pointer; overload;
    class function MethodAddress(const Name: string): Pointer; overload;
    class function MethodName(Address: Pointer): string;
    class function QualifiedClassName: string;
    function FieldAddress(const Name: _ShortStr): Pointer; overload;
    function FieldAddress(const Name: string): Pointer; overload;
    function GetInterface(const IID: TGUID; out Obj): Boolean;
    class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
    class function GetInterfaceTable: PInterfaceTable;
    class function UnitName: string;
    class function UnitScope: string;
{$IFDEF AUTOREFCOUNT}
    function __ObjAddRef: Integer; virtual;
    function __ObjRelease: Integer; virtual;
{$ENDIF}
    function Equals(Obj: TObject): Boolean; virtual;
    function GetHashCode: Integer; virtual;
    function ToString: string; virtual;
    function SafeCallException(ExceptObject: TObject;
      ExceptAddr: Pointer): HResult; virtual;
    procedure AfterConstruction; virtual;
    procedure BeforeDestruction; virtual;
    procedure Dispatch(var Message); virtual;
    procedure DefaultHandler(var Message); virtual;
    class function NewInstance: TObject {$IFDEF AUTOREFCOUNT} unsafe {$ENDIF}; virtual;
    procedure FreeInstance; virtual;
{$IFDEF AUTOREFCOUNT}
  protected
{$ENDIF}
    destructor Destroy; virtual;

{$IFDEF CPP_ABI_SUPPORT}
    procedure CPP_ABI_1; virtual;
    procedure CPP_ABI_2; virtual;
    procedure CPP_ABI_3; virtual;
{$ENDIF !CPP_ABI_SUPPORT}

  protected
    function GetDisposed: Boolean; inline;
    procedure CheckDisposed; {$IFNDEF AUTOREFCOUNT} inline; {$ENDIF}

{$IFDEF AUTOREFCOUNT}
  private const
    objDestroyingFlag = Integer($80000000);
    objDisposedFlag = Integer($40000000);
  protected
    [Volatile] FRefCount: Integer;
    class procedure __MarkDestroying(const Obj); static; inline;
    class function __SetDisposed(const Obj): Boolean; static; inline;
  public
    property RefCount: Integer read FRefCount;
{$ENDIF}
    property Disposed: Boolean read GetDisposed;
  end;

ここでモバイル プラットフォームでポインターが使用されていることは明らかです。

Embarcadero のホワイト ペーパーで、次のテーマについて読んでください: The Delphi Language for Mobile Development . 繰り返しますが、複数の場面でのポインターの使用をカバーしており、それらがサポートされていることは明らかです。さて、ポインターの使用が推奨されていないことも事実です。ポインターを簡単に回避できる場合は、そうすることをお勧めします。しかし、それは、ポインターがコンパイラーによってサポートされていないということとはまったく異なります。

Embarcadero が自社製品の FUD を広めていることは、少なくとも少し皮肉なことのようです。

于 2015-06-29T12:00:24.177 に答える