作为为指针和非指针数据类型创建单独模型的明智决定,Microsoft 提出了一组数据类型,强烈建议使用它们而不是像int
, __int64
, long
(signed
和unsigned
版本)这样的 POD。
Microsoft 遵循的当前模型IL32P64
迫使所有 C 类型的指针转换为易受指针截断的整数类型。这迫使他们想出 _PTR 类型。对于每个有效的整数类型(有符号无符号)long
或非int
POD 类型DWORD
,他们提出了等效的符号DWORD_PTR
, INT_PTR
。
如果我们解析 typedef 链,所有这些类型都归结为以下定义
#if defined(_WIN64)
typedef unsigned __int64 ULONG_PTR;
#else
typedef unsigned long ULONG_PTR;
#endif
#if defined(_WIN64)
typedef unsigned __int64 LONG_PTR;
#else
typedef unsigned long LONG_PTR;
#endif
我想知道的是,为每个整数类型和非 POD 等价物创建不同类型定义的原因,而不是创建一个供所有人使用的单一类型(比如一个INT_PTR
and UINT_PTR
)
那我为什么想知道?
如果您一直在 MS 平台,很少会遇到 MS 提出的问题。如果您的代码是多平台的,就会出现问题。您必须为 *nix 定义等效类型以使您的代码可移植。
我打算只创建两个指针类型XI64_PTR
,并且XU64_PTR
具有等效的定义并使用它,而不管以前的类型是什么。