Sdk typedef INT_PTR和LONG_PTR问题

Sdk typedef INT_PTR和LONG_PTR问题,sdk,typedef,Sdk,Typedef,我阅读了一些代码并跳转到windows sdk文件:c:\program files\microsoft visual studio 8\vc\platformsdk\include\basetsd.h typedef _W64 int INT_PTR, *PINT_PTR; typedef _W64 unsigned int UINT_PTR, *PUINT_PTR; typedef _W64 long LONG_PTR, *PLONG_PTR; typedef _W64 unsigned

我阅读了一些代码并跳转到windows sdk文件:c:\program files\microsoft visual studio 8\vc\platformsdk\include\basetsd.h

typedef _W64 int INT_PTR, *PINT_PTR;
typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;

typedef _W64 long LONG_PTR, *PLONG_PTR;
typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;

#define __int3264   __int32
我 谷歌搜索发现INT_PTR表示一个与指针大小相等的INT。
但是长时间的PTR意味着什么?与指针大小相等的长指针。但是long和int的大小是否不同?

这些宏对于使Win32代码可移植非常有用,因此它可以在32位和64位模式下构建。在某些情况下,它们还指示变量可能包含数字或指针

INT\u PTR
LONG\u PTR
的目的是替换实际用于保存指针的
INT
LONG
声明(通常是一件坏事,但我遇到的旧代码有时会重载此类字段,并使用它们包含0和-1之类的前哨整数,或一个实指针)。例如,在Win32代码中,
int
long
char*
都是4个字节。在Win64代码中,
int
long
仍然是4个字节,但是
char*
是8个字节;如果使用C样式转换将
char*
存储在int中,它将被静默截断

INT_PTR
LONG_PTR
(以及它们的无符号变体)是不同的,它们的命名是为了更容易地修复这些用法,因为它们保证适合
INT
LONG
或指针。如果您有
int
,请将其替换为
int\u PTR
unsigned int
应替换为
UINT_PTR
long
应替换为
long_PTR
,等等。这种类型在为任一类型(int、long、pointer…)分配足够存储的同时保留了原始语义

例如:

int iptr = (int) pData;   // bad
可能是

INT_PTR iptr = (INT_PTR) pData;     // better
这将适用于x86和x64编译

请注意,必须更改指针的强制转换,以避免潜在的截断。幸运的是,如果您不这样做,VisualStudio2015将警告您

由于Windows
HANDLE
类型现在被定义为指针,因此同样适用于它们。但是,请注意,即使在64位模式下,句柄仍然可以安全地截断以适合4个字节。对于实际指针,这是不正确的