delphi – 如何调整为WINx86编译的代码以便为WINx64编译
发布时间:2020-12-15 09:42:14 所属栏目:大数据 来源:网络整理
导读:我正在使用Component Tag(NativeInt)值的赋值将其添加到字节集中.该程序在为WIN32编译时工作正常,但不为WINx64编译. (错误2001需要序数类型) 这是一个MCVE: program Project1;{$APPTYPE CONSOLE}{$R *.res}uses System.SysUtils,System.Classes; var S:set
我正在使用Component Tag(NativeInt)值的赋值将其添加到字节集中.该程序在为WIN32编译时工作正常,但不为WINx64编译. (错误2001需要序数类型)
这是一个MCVE: program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils,System.Classes; var S:set of byte; C:TComponent; begin C:=TComponent.Create(nil); C.Tag:=1; s:=[C.Tag]; C.Free; end. 如何调整代码使其适合WINx64编译? 解决方法
标签是NativeInt.这是x86中的32位,x64中的64位.据我了解,32位整数被认为是序数,64位整数不是序数.这就是编译器错误的原因,我想,尽管为什么Integer被认为是一个序数类型,而Int64不是,我不能告诉你.如果我不得不猜测,我会想到这与Int64不适合x86上的寄存器的事实有关,因此与1,2和4字节序数类型相比,需要与编译器完全不同的处理.
既然你可能不想要改变大小的东西,我希望你可以转换为Integer: s := [Integer(C.Tag)]; 既然你只使用低8位,你应该把它转换为Byte: s := [Byte(C.Tag)]; 最好是断言你在范围内: Assert((C.Tag >= low(Byte)) and (C.Tag <= high(Byte))) 坦率地说,在我看来,你完全避免使用Tag.将数据存储在专用于该任务的变量中,并使用您可以选择的类型.作为一般规则,Tag是你应该避免使用的东西.它不是类型安全的,除非你碰巧有一个NatoiveInt存储,它的名字没有给出其内容的指示,当多方试图使用它时,很容易发生碰撞. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |