为什么WINAPI如此冗余?

为什么WINAPI如此冗余?,winapi,Winapi,我刚开始研究WINAPI,我在Windows数据类型网页上注意到的第一件事是冗余。例如,LONG32在BaseTsd.h中声明为 typedef signed int LONG32; 和INT32,也在BaseTsd.h中声明 typedef signed int INT32; DWORD在IntSafe.h中声明为 typedef unsigned long DWORD 而ULONG在WinDef.h中声明为 typedef unsigned long ULONG; 如果它们在实践中都

我刚开始研究WINAPI,我在Windows数据类型网页上注意到的第一件事是冗余。例如,LONG32在BaseTsd.h中声明为

typedef signed int LONG32;
和INT32,也在BaseTsd.h中声明

typedef signed int INT32;
DWORD在IntSafe.h中声明为

typedef unsigned long DWORD
而ULONG在WinDef.h中声明为

typedef unsigned long ULONG;
如果它们在实践中都是相同的,为什么会有不同的数据类型

还有,我们有这个

typedef HANDLE HCONVLIST; //A handle to a DDE conversation list.
typedef HANDLE HDC; //  A handle to a device context (DC).
typedef HANDLE HDDEDATA; // A handle to DDE data.

如果数据类型都是HANDLE,为什么会有不同的数据类型呢?

关于这一点的决定是在没有完善的C标准的时候做出的。API至今仍在运行。30年前为Windows3.1编写的软件很有可能仍在Windows10下运行。没有多少API能存活这么长时间,或者被这么多开发人员使用


HDC
这样的typedef添加了另一个间接级别,但使意图更加明确。
HDC
变量应指向设备上下文,而不是其他内容。它类似于使用
typedef unsigned int Age
以明确变量应存储年龄值,而不是其他值,例如端口号。

此外,对于
句柄
,启用时,大多数句柄类型实际上根本不是同一类型。大多数句柄类型是使用
DECLARE\u handle()
宏声明的,因此当启用
STRICT
时,它们映射到唯一的结构类型,当禁用
STRICT
时,它们映射到
void*
。但它们并不是像您所展示的那样简单的
HANDLE
类型定义。更重要的是,像
HDC
这样的抽象也增加了安全级别。一旦输入,当传递
HDC
时,期望
HWND
的API调用将无法编译。我不确定这是什么时候添加的,或者它是否是决策中的一个因素,但它在保护软件开发中最薄弱的环节(开发人员)方面确实很有价值。