首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >INT_PTR和LONG_PTR问题

INT_PTR和LONG_PTR问题
EN

Stack Overflow用户
提问于 2013-03-15 03:28:08
回答 1查看 1.8K关注 0票数 3

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

代码语言:javascript
运行
复制
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是什么意思呢?长度与指针大小相等的长度。但是一个长的和整数的大小不一样吗?

EN

回答 1

Stack Overflow用户

发布于 2016-11-10 17:05:42

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

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

INT_PTRLONG_PTR (以及它们的无符号变体)是不同的,它们的命名是为了更容易地修复那些保证适合intlong或指针的用法。如果您有一个int,请用INT_PTR替换它;unsigned int应该替换为UINT_PTRlong应该替换为LONG_PTR等等。这保留了原始语义,同时为这两种类型(int、long、指针.)分配了足够的存储空间。

示例:

代码语言:javascript
运行
复制
int iptr = (int) pData;   // bad

可能是

代码语言:javascript
运行
复制
INT_PTR iptr = (INT_PTR) pData;     // better

这将同时适用于x86和x64编译。

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

由于Windows HANDLE类型现在被定义为指针,所以同样的情况也适用于它们。但是,请注意,即使在64位模式下,句柄仍然可以安全地截断成4个字节。对于实际指针来说,情况并非如此。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15424172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档