Windows 代码规范

代码样式

如果你刚刚接触 Windows 编程开发,有些很多东西会让人看起来莫名其妙。在很多代码中充斥着奇怪的类型标识,类似 DWORD_PTR 或者 LPRECT 等等,并且大多数的变量名的定义都是按照匈牙利的命名规范定制的,例如 hWnd 或者 pwsz 等等,你可能需要花费一些时间来熟悉这些东西。
绝大多数的 Windows API 都是以普通函数或者 组件对象模型 (COM) 接口的形式提供的,少数的接口以 C++ 类的形式提供(如:GDI+)。

1. 类型列表

Windows 头文件中包含了很多独特的类型定义,大多数的定义都在 WinDef.h 文件中,下面是常用的类型列表:

数据类型大小有符号?
BYTE8 bitsUnsigned
DWORD32 bitsUnsigned
INT3232 bitsSigned
INT6464 bitsSigned
LONG32 bitsSigned
LONGLONG64 bitsSigned
UINT3232 bitsUnsigned
UINT6464 bitsUnsigned
ULONG32 bitsUnsigned
ULONGLONG64 bitsUnsigned
WORD16 bitsUnsigned

如上表所示,为了兼容一些历史的程序,所以列表中的类型存在一定的冗余。这些类型在32位和64位程序中的大小都是固定的。例如:DWORD 类型在32位和64位程序中都是32位大小。

2. Boolean 类型

在 Windows 编程中存在一种 BOOL 类型。该类型是整形的别名,并不是 C++ 中的 bool 类型。
在 WinDef.h 头文件中,定义两个 BOOL 类型的值:


#define FALSE    0
#define TRUE     1

如果有函数返回一个 BOOL 类型,其真实的结果可能返回的是一个非0值,所以下面这种方式判断是错误的:

// Wrong!
if (result == TRUE)
{
    ...
}

应该使用如下代码:

// Right way.
BOOL result = SomeFunctionThatReturnsBoolean();
if (result)
{
    ...
}

BOOL 类型并不等价于C++中的 bool 类型!

3. 指针类型

Windows 定义了很多指针类型,通常都是以 P- 或者 LP- 开始的类型名称。如:LPRECT 代表指向 RECT 类型的指针。
RECT 类型代表一个矩形结构体, 下面几种定义方式是等价的:

RECT*  rect;  // Pointer to a RECT structure.
LPRECT rect;  // The same
PRECT  rect;  // Also the same.

历史上,P 前缀的指针叫 pointer ,LP 前缀的指针叫 long pointer。二者是16位操作系统向32位操作系统过渡时期遗留的产物,如今二者已经没有区别了。
虽然如今已经不分“长短”了,但是依然会出现一个兼容问题,特别是在程序逻辑中存在指针和整形的转化关系的时候。为了解决这个问题,Windows 定义了几种明确的指针类型:

  • DWORD_PTR
  • INT_PTR
  • LONG_PTR
  • ULONG_PTR
  • UINT_PTR

如果在程序逻辑上存在32位值扩展到64位值的情况,请使用上述类型。

4. 匈牙利标记法

匈牙利标记法这是为了纪念具有传奇色彩的微软程序员 Charles Simonyi。这种标记法非常简单,即变量名表明该变量数据类型的小写字母开始。例如,szCmdLine 的前缀 sz 表示“以零结束的字符串”。

  • p 指针
  • h 句柄
  • sz 字符串
  • b BYTE
  • ul ULOGN
  • l LONG
  • i INT
  • ui UINT
  • ch CHAR
  • dw DWORD
  • hr HRESULT

大佬,给点反馈?

平均评分 / 5. 投票数:

很抱歉,这篇文章不能帮助到你

请让我们改进这篇文章

告诉我们我们如何改善这篇文章?

发表评论

邮箱地址不会被公开。 必填项已用*标注