WINAPI - 编码约定

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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容