为什么Format拒绝以XE4开头的过程地址参数

Dav*_*nan 6 delphi

考虑这个程序:

{$APPTYPE CONSOLE}

uses
  System.SysUtils;

procedure Foo;
begin
end;

type
  TProcedure = procedure;

const
  FooConst: TProcedure = Foo;

var
  FooVar: TProcedure = Foo;
  P: Pointer;

{$TYPEDADDRESS ON}

begin
  P := @Foo;
  Writeln(Format('%p', [P]));
  Writeln(Format('%p', [@FooConst]));
  Writeln(Format('%p', [@FooVar]));
  Writeln(Format('%p', [@Foo]));
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

该程序在XE3上编译并运行,并产生以下输出:

00419FB8
00419FB8
00419FB8
00419FB8

在XE4及更高版本上,程序无法编译,并且在以下两行中都有错误消息:

Writeln(Format('%p', [@FooConst]));
Writeln(Format('%p', [@FooVar]));
Run Code Online (Sandbox Code Playgroud)
[dcc32 Error] E2250 There is no overloaded version of 'Format' that can be called
with these arguments

在XE4,XE5和XE6上,程序在$TYPEDADDRESS关闭时编译.在XE7上,无论设置如何,程序都无法编译$TYPEDADDRESS.

这是编译器错误吗?或者我使用不正确的语法来获取过程的地址?

Dav*_*nan 4

我认为这是一个编译器错误,并已提交 QC 报告:QC#127814

作为解决方法,您可以使用以下任一方法:

  1. 使用addr()而不是@操作符。
  2. 投射@FooVar@FooConstPointer,例如Pointer(@FooVar)