Delphi2007和XE2:使用NativeInt
自Delphi XE2以来,NativeInt有了新的含义。在32位运行时,NativeInt是32位整数。在64位运行时,NativeInt是64位整数 我有一些使用第三方DLL(32位和64位)的源文件。这些DLL分别在32和64平台中使用32位和64位整数 这些源文件在Delphi 2007-Delphi XE2 32位平台中工作,没有问题: e、 g: 当我尝试将这些源文件迁移到Delphi XE2 64位平台时,上述函数不再工作,因为它需要64位整数。为了使源代码同时适用于32/64平台,我改为Delphi2007和XE2:使用NativeInt,delphi,delphi-xe2,delphi-2007,Delphi,Delphi Xe2,Delphi 2007,自Delphi XE2以来,NativeInt有了新的含义。在32位运行时,NativeInt是32位整数。在64位运行时,NativeInt是64位整数 我有一些使用第三方DLL(32位和64位)的源文件。这些DLL分别在32和64平台中使用32位和64位整数 这些源文件在Delphi 2007-Delphi XE2 32位平台中工作,没有问题: e、 g: 当我尝试将这些源文件迁移到Delphi XE2 64位平台时,上述函数不再工作,因为它需要64位整数。为了使源代码同时适用于32/64平
function Test: NativeInt;
它是有效的
但是,该声明在Delphi2007中不起作用,因为Delphi2007将NativeInt视为64位整数:SizeOf(NativeInt)=8
我可以通过使用条件指令RtlVersion或compilervision来解决这个问题
function Test: {$if CompilerVersion<=18.5}Integer{$else}NativeInt{$ifend};
函数测试:{$if CompilerVersionGee:为什么不直接使用LongInt(需要32位)和Int64(否则)
只要在不重要的地方使用“整数”就行了
使用“NativeInt”似乎有悖常理,因为你知道它在不同的时间意味着不同的事情
附言:
您始终可以定义自己的自定义类型和$ifdef it!更好的选择是重新声明NativeInt类型本身:
{$if CompilerVersion<=18.5}
type
NativeInt = Integer;
{$ifend}
{$if compilerversionbest me to it!真正的问题是,在Delphi 2007中,NativeInt被错误地定义了,而在D2009@kibab没有,只是在Delphi2009(版本12.0.3420.21218)上测试过-SizeOf(Native(U)Int)=4@Gerry:SizeOf(Native[U]Int)=Delphi中的82007@Serg:可能定义正确(如大小),但不是在“compiler/codegen”中,请参见-so NativeUInt在D2009中是无用的,所以我会使用{$if CompilerVersion请阅读Barry Kelly在这里的帖子:因为NativeUInt映射到Longword或UInt64,这取决于平台。但是如果代码必须是跨平台的(Win32或Win32 64),使用X:NativeUInt;
而不是X:{$IFDEF Win32}长词{$ENDIF}{$IFDEF Win64}UInt64{$ENDIF};
是有意义的。NativeInt和NativeUInt是为此目的定义的,但显然并不总是正确的。
{$if CompilerVersion<=18.5}
type
NativeInt = Integer;
{$ifend}