加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 10:04:30 所属栏目:大数据 来源:网络整理
导读:考虑这个程序: {$APPTYPE CONSOLE}uses System.SysUtils;procedure Foo;beginend;type TProcedure = procedure;const FooConst: TProcedure = Foo;var FooVar: TProcedure = Foo; P: Pointer;{$TYPEDADDRESS ON}begin P := @Foo; Writeln(Format('%p',[P]))
考虑这个程序:
{$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 Error] E2250 There is no overloaded version of 'Format' that can be called
with these arguments

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

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

解决方法

我相信这是一个编译器错误并提交了QC报告: QC#127814.

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

>使用addr()而不是@运算符.>将@FooVar或@FooConst转换为指针,例如指针(@FooVar).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读