我发现Windows有一些新的Windows Data Types
DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR
你能告诉我何时,如何以及为何使用它们?
答案 0 :(得分:27)
*_PTR
类型已添加到Windows API中,以支持Win64的64位寻址。
由于32位API通常使用DWORD
等数据类型传递指针,因此有必要创建64位兼容性的新类型,可以替代32位应用程序中的DWORD
,但在使用时扩展为64位在64位应用程序中。
因此,例如,想要编写32位或64位Windows 32位API SetWindowLong(HWND,int,LONG)
的代码的应用程序开发人员已更改为SetWindowLongPtr(HWND,int,LONG_PTR)
在32位版本中,SetWindowLongPtr
只是一个解析为SetWindowLong
的宏,LONG_PTR
同样是一个解析为LONG
的宏。
另一方面,在64位构建中,SetWindowLongPtr
是一个API,它接受64位长作为其第3个参数,ULONG_PTR
是unsigned __int64
的typedef。
通过使用这些_PTR
类型,一个代码库可以为Win32和Win64目标进行编译。
执行指针运算时,这些类型也应该用于需要与64位兼容的32位代码。
所以,如果你需要访问一个超过40亿个元素的数组,你需要使用INT_PTR而不是INT
CHAR* pHuge = new CHAR[0x200000000]; // allocate 8 billion bytes
INT idx;
INT_PTR idx2;
pHuge[idx]; // can only access the 1st 4 billion elements.
pHuge[idx2]; // can access all 64bits of potential array space.
答案 1 :(得分:6)
Chris Becke非常正确。值得注意的是,这些_PTR类型只是在32位应用程序上为32位宽,在64位应用程序上为64位宽的类型。就这么简单。
例如,您可以轻松使用__int3264而不是INT_PTR。