考虑这个程序:
{$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
.
这是编译器错误吗?或者我使用不正确的语法来获取过程的地址?
归档时间: |
|
查看次数: |
377 次 |
最近记录: |