Warum werden Adressargumente für die Zurückweisungsprozedur formatiert, die mit XE4 @ beginne
Betrachten Sie dieses Programm:
{$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.
Dieses Programm kompiliert und läuft auf XE3 und erzeugt die folgende Ausgabe:
00419FB8 00419FB8 00419FB8 00419FB8
uf XE4 und höher kann das Programm nicht kompiliert werden. In beiden Zeilen werden folgende Fehlermeldungen angezeigt:
Writeln(Format('%p', [@FooConst]));
Writeln(Format('%p', [@FooVar]));
[dcc32 Error] E2250 There is no overloaded version of 'Format' that can be called with these arguments
uf XE4, XE5 und XE6 kompiliert das Programm, wenn$TYPEDADDRESS
ist ausgeschaltet. Auf XE7 kann das Programm unabhängig von der Einstellung von @ nicht kompiliert werde$TYPEDADDRESS
.
Ist das ein Compiler-Fehler? Oder verwende ich eine falsche Syntax, um die Adresse einer Prozedur zu erhalten?