初次接触Windows编程,发现代码通篇都是奇奇怪怪的东西。像DWORD_PTR和DWORD_PTR这些东西,让人很是迷惑。本来入门还算容易,结果因为这些奇奇怪怪的东西,生生拖延了很多时间。看起来实在费劲。故需先跟他们混个眼儿熟,以便他们奇怪的外形不至于让开发者看着眼晕。文章内容很多都参考了官方文档,若有翻译不准确的请温柔地指出。
先来看下这群奇怪的东西分别所占的位数。
BYTE | 8 bits | Unsigned |
DWORD | 32 bits | Unsigned |
INT32 | 32 bits | Signed |
INT64 | 64 bits | Signed |
LONG | 32 bits | Signed |
LONGLONG | 64 bits | Signed |
UINT32 | 32 bits | Unsigned |
UINT64 | 64 bits | Unsigned |
ULONG | 32 bits | Unsigned |
ULONGLONG | 64 bits | Unsigned |
WORD | 16 bits | Unsigned |
他们的值其实都是整型数值,size是固定的,不管是在32位机上还是64位计算机上,大小都不变。
BOOL类型
BOOL是用在Boolean环境中的整型数值。0代表false,1代表true。
#define FALSE 0
#define TRUE 1
事实上,任何非0数值都能表示true,很多方法返回的bool类型,但返回值可能不1,所代表含义也是true。所以不能简单地判断方法返回值是否为TRUE。
以下的写法是正确的。
// Right way.
BOOL result = SomeFunctionThatReturnsBoolean();
if (result)
{
...
}
以下的写法是错误的。
// Wrong!
if (result == TRUE)
{
...
}
需要注意的是,BOOL是整型,不同于C++中的bool类型。
指针类型
Windows中有很多以P或LP为前缀的类型,例如LPRECT,是RECT类型的指针,而RECT是描述矩形的结构体。
RECT* rect; // Pointer to a RECT structure.
LPRECT rect; // The same
PRECT rect; // Also the same.
P和LP在以前是有区别的,如今没什么区别。都代表指针。
有精度的指针类型
以下数据类型的size取决于编译环境,在32位机上是32位,在64位机上是64位。32位的应用运行在64位机上,其类型还是4字节,但64位的应用不能再32位的环境中运行。
- DWORD_PTR
- INT_PTR
- LONG_PTR
- ULONG_PTR
- UINT_PTR
以上用适用于需要整型类型指针的情况。他们用于为指针算法定义变量,定义循环计数器来遍历缓存中的所有字节。通常情况下,他们出现在64位操作系统中将现有32位扩展为64位的地方。
匈牙利标记法
此法在定义变量名的时候加前缀来表示额外的信息。有的告诉你变量的类型,也有的表示语义信息,告诉你变量的预期用途。
例如 i 表示 index ,cb表示字节数, rw表示行,col表示列。如果你看到一个表达式是rwPosition + cbTable,便可怀疑这是一个错误,因为行的位置不能和字节数相加,逻辑上没有意义。
Windows编程中很多都用匈牙利表示法,所以需要了解一下。