我读了一些代码并跳转到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
我用google搜索并发现INT_PTR意味着一个int,它的大小与指针相等。 但LONG_PTR是什么意思?一个长度,与指针大小相等。但是不是长和不同的大小?
答案 0 :(得分:0)
这些宏对于使Win32代码可移植非常有用,因此它可以在32位和64位模式下构建。在某些情况下,它们还表明变量可能包含数字或指针。
INT_PTR
和LONG_PTR
的目的是替换实际用于保存指针的int
和long
的声明(通常是坏事,但是旧的)我遇到的代码有时会重载这些字段并使用它们来包含像0和-1这样的标记整数,或者是真正的指针。例如,在Win32代码中,int
,long
和char *
都是4个字节。在Win64代码中,int
和long
仍然是4个字节,但char *
是8个字节;如果char *
使用C风格的强制转换存储在int中,它将被静默截断。
INT_PTR
和LONG_PTR
(以及他们的无符号变体)是不同的,因为它们可以更容易修复这些用法,因为它们可以保证适合int
或long
或指针。如果您有int
,请将其替换为INT_PTR
; unsigned int
应替换为UINT_PTR
,long
应替换为LONG_PTR
等。这类保留原始语义,同时为任一类型分配足够的存储空间(int,long ,指针......)。
示例:
int iptr = (int) pData; // bad
可能是
INT_PTR iptr = (INT_PTR) pData; // better
这将适用于x86和x64编译。
请注意,必须更改指针的强制转换以避免潜在的截断。幸运的是,如果不这样做,Visual Studio 2015会发出警告。
由于Windows HANDLE
类型现在被定义为指针,因此同样适用于它们。但请注意,即使在64位模式下,句柄仍然可以安全地截断以适应4个字节。实际指针并非如此。