我读了一些代码并跳转到windows文件:c:\program \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是什么意思呢?长度与指针大小相等的长度。但是一个长的和整数的大小不一样吗?
发布于 2016-11-10 17:05:42
这些宏对于使Win32代码可移植非常有用,因此它可以在32位和64位模式下构建。在某些情况下,它们还表示变量可能包含数字或指针。
INT_PTR和LONG_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_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 2015将警告您。
由于Windows HANDLE类型现在被定义为指针,所以同样的情况也适用于它们。但是,请注意,即使在64位模式下,句柄仍然可以安全地截断成4个字节。对于实际指针来说,情况并非如此。
https://stackoverflow.com/questions/15424172
复制相似问题