3

我读了一些代码并跳转到 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,它的大小等于一个指针。但是 LONG_PTR 是什么意思?一个长度等于指针的长度。但是long和int大小不一样吗?

4

1 回答 1

1

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

INT_PTRand的目的LONG_PTR是替换实际用于保存指针的intand的声明long(通常是一件坏事,但我遇到的旧代码有时会重载此类字段并使用它们来包含标记整数,例如 0 和 -1,或者一个真正的指针)。例如,在 Win32 代码中,、、intlong都是char *4 个字节。在 Win64 代码中,int仍然long是 4 个字节,但是char *是 8 个字节;如果 achar *使用 C 风格转换存储在 int 中,它将被静默截断。

INT_PTRand LONG_PTR(以及它们的无符号变体)是不同的,并且按原样命名,以便更容易修复此类用法,因为它们保证适合intorlong或指针。如果您有int,请将其替换为INT_PTR; unsigned int应该替换为UINT_PTRlong应该替换为LONG_PTR,等等。这种保留原始语义的同时为任一类型(int、long、pointer...)分配足够的存储空间。

例子:

int iptr = (int) pData;   // bad

可能

INT_PTR iptr = (INT_PTR) pData;     // better

这适用于 x86 和 x64 编译。

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

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

于 2016-11-10T17:05:42.307 回答