typedef INT_PTR和LONG_PTR问题

时间:2013-03-15 03:28:08

标签: 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 long ULONG_PTR, *PULONG_PTR;

#define __int3264   __int32

我用google搜索并发现INT_PTR意味着一个int,它的大小与指针相等。 但LONG_PTR是什么意思?一个长度,与指针大小相等。但是不是长和不同的大小?

1 个答案:

答案 0 :(得分:0)

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

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

INT_PTRLONG_PTR(以及他们的无符号变体)是不同的,因为它们可以更容易修复这些用法,因为它们可以保证适合intlong或指针。如果您有int,请将其替换为INT_PTR; unsigned int应替换为UINT_PTRlong应替换为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个字节。实际指针并非如此。