我发现Windows有一些新的Windows数据types
DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR
你能告诉我什么时候,如何和为什么使用它们?
*_PTR
类型被添加到Windows API以支持Win64的64位寻址。
由于32位API用于存储使用DWORDS
等数据类型的指针,因此有必要创建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
是接受64位长的API作为其第三参数,而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.
克里斯贝克是非常正确的。 值得注意的是,这些_PTR类型只是32位应用程序的32位宽和64位应用程序的64位宽的类型。 就这么简单。
例如,您可以轻松使用__int3264而不是INT_PTR。