Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi2007和XE2:使用NativeInt_Delphi_Delphi Xe2_Delphi 2007 - Fatal编程技术网

Delphi2007和XE2:使用NativeInt

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平

自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}