WINAPI 使用的时候会出现很多带着之前编码时不认识的前缀或者很多不认识的类型,这些大部分都是 WINAPI 编码约定的内容。
一、Typedef 约定数据类型
Windows 头文件包含许多 typedef,较为常见的是一些类型的定义转换规则。
- BYTE - 标准字节,8 位无符号
- DWORD - 32 位无符号数
- INT32 - 32 位有符号数
- INT64 - 64 位有符号数
- LONG - 32 位有符号数
- LONGLONG - 64 位有符号数
- UINT32 - 32 位无符号数
- UINT64 - 64 位无符号数
- ULONG - 32 位无符号数
- ULONGLONG - 64 位无符号数
- WORD - 16 位无符号数
这些类型里面有一定数量的重复,这个和 WINAPI 的历史有关。这几个类型是固定大小的,比如 DWORD 类型始终为 32 位宽。
二、布尔类型
BOOL 是 int 的类型别面,不同于 bool 和其它表示布尔值的类型。
- define FALSE 0
- define TRUE 0
需要注意的一个问题是,返回 BOOL 类型的大多数函数都可以返回任何非零值来表示 TRUE,因此判断时需要注意一下,尽量使用下面这种语句判断:
if (SomeFunctionThatReturnsBoolean())
{
...
}
// or
if (SomeFunctionThatReturnBoolean() != FALSE)
{
...
}
/*
说实话,看上去还是前者更标准...
*/
三、指针类型
Windows 对很多结构都有对应的指针数据类型,这些类型名字通常具有 P 前缀或者 LP 前缀。
// 下面三种写法的含义是一样的
XXX* example;
LPXXX example;
PXXX* example;
P 为指针,LP 表示长指针,区别在于 LP 前缀的指针类型长度要比 P 前缀的类型更长,方便从例如 16 位到 32 位 Windows 的移植。这些指针类型都是等效的。避免使用这些前缀,如果必须使用一个的话,使用 P。
四、指针精度类型
以下数据类型始终是指针的大小:
- DWORD_PTR
- INT_PTR
- LONG_PTR
- ULONG_PTR
- UINT_PTR
这些类型用于整数可能强制转换到指针等情况。
五、匈牙利语表示法
匈牙利语表示法是向变量名称添加前缀以及提供有关变量的其它信息的做法(不是说用匈牙利语表示,只是表示法的发明者名字是匈牙利语,以此得名)。
使用上例如:
- xxxdw 的 dw 表示 DWORD
- xxxw 的 w 表示 WORD