【发布时间】:2014-09-12 20:01:30
【问题描述】:
考虑这个程序:
{$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.
此程序在 XE3 上编译和运行,并产生以下输出:
00419FB8 00419FB8 00419FB8 00419FB8在 XE4 及更高版本上,程序无法编译,这两行都显示错误消息:
Writeln(Format('%p', [@FooConst]));
Writeln(Format('%p', [@FooVar]));
[dcc32 错误] E2250 没有可以调用的“格式”的重载版本
带着这些论点
在 XE4、XE5 和 XE6 上,当 $TYPEDADDRESS 关闭时程序编译。在 XE7 上,无论$TYPEDADDRESS 的设置如何,程序都无法编译。
这是编译器错误吗?还是我使用了不正确的语法来获取过程的地址?
【问题讨论】:
-
Addr(FooConst)和Addr(FooVar)在 XE6 中工作。 System.Addr 不受 $T 指令的影响。现在手头没有 XE7。 -
@LURD
Addr(...)在 XE7 中也可以正确编译和运行。这很奇怪,并且指向编译器错误。谢谢。 -
FWIW,
Pointer(@FooConst)在 XE6 和 XE7 中同样有效。 -
@LURD 是的,我也观察到了
标签: delphi