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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |