如果您不熟悉Windows编程,那么在第一次看到Windows程序时可能会感到不安。该代码充满了像DWORD_PTR和LPRECT这样的奇怪的类型定义,变量的名字像hWnd和pwsz(称为匈牙利符号)。学习一些Windows编码习惯是值得花点时间的。
绝大多数Windows API由功能或组件对象模型(COM)接口组成。很少有Windows API作为C++类提供。(一个明显的例外是GDI+,其中一个2D图形API。)
类型定义
Windows头文件包含很多typedef。其中许多是在头文件WinDef.h中定义的。这里有一些你会经常遇到的。
整数类型
数据类型 | 大小 | 是否有符号 |
---|---|---|
BYTE | 8 bits | 无符号 |
DWORD | 32 bits | 无符号 |
INT32 | 32 bits | 有符号 |
INT64 | 64 bits | 有符号 |
LONG | 32 bits | 有符号 |
LONGLONG | 64 bits | 有符号 |
UINT32 | 32 bits | 无符号 |
UINT64 | 64 bits | 无符号 |
ULONG | 32 bits | 无符号 |
ULONGLONG | 64 bits | 无符号 |
WORD | 16 bits | 无符号 |
正如你所看到的,这些类型定义有一定的冗余。其中一些重叠是由于Windows API的历史。这里列出的类型具有固定大小,并且在32位和64位应用程序中的大小是相同的。例如,DWORD类型总是32位宽。
布尔类型
BOOL是在布尔上下文中使用的整数值的typedef。头文件WinDef.h也定义了两个用于BOOL的值。
#define FALSE 0
#define TRUE 1
尽管定义了TRUE,但大多数返回BOOL类型的函数都可以返回任何非零值来指示布尔值。因此,你应该总是这样写:
// Right way.
BOOL result=SomeFunctionThatReturnsBoolean();
if(result){
...
}
而不是这个:
// Wrong!
if(result==TRUE){
...
}
请注意,BOOL是一个整数类型,不能与C++ bool类型互换。
指针类型
Windows定义了表单pointer-to-X的许多数据类型。这些名称中通常有前缀P-或LP-。例如,LPRECT是指向RECT的指针,其中RECT是描述矩形的结构。以下变量声明是等效的。
RECT *rect; // Pointer to a RECT structure.
LPRECT rect; // The same
PRECT rect; // Also the same.
历史上,P代表”指针”,LP代表”长指针”。长指针(也称为远指针)是16位Windows的保留,当它们需要处理当前段以外的内存范围时。LP前缀被保留,以便于将16位代码移植到32位Windows。今天没有区别——指针是指针。
指针精度类型
以下数据类型始终是指针的大小——即在32位应用程序中为32位宽,在64位应用程序中为64位。大小是在编译时确定的。当32位应用程序在64位Windows上运行时,这些数据类型仍然是4个字节宽。(64位应用程序无法在32位Windows上运行,所以不会出现相反的情况。)
- DWORD_PTR
- INT_PTR
- LONG_PTR
- ULONG_PTR
- UINT_PTR
这些类型用于可能将整型转换为指针的情况。它们也用于定义指针运算的变量,并定义在内存缓冲区中遍历整个字节范围的循环计数器。更一般地说,它们出现在现有的32位值在64位Windows上扩展到64位的地方。
匈牙利符号
匈牙利符号是为变量的名称添加前缀以提供有关变量的附加信息的做法。(这个符号的发明者查尔斯·西蒙尼(Charles Simonyi)是匈牙利人,因此它的名字)。
匈牙利符号以其原始形式给出关于变量的语义信息,告诉您预期的用途。例如,i表示索引,cb表示以字节为单位的大小(“字节数”),而rw和col表示行和列的数字。这些前缀旨在避免在错误的上下文中意外使用变量。例如,如果你看到表达式rwPosition+cbTable,你就会知道一个行号被添加到一个大小,这几乎肯定是代码中的一个错误
匈牙利符号的一个更常见的形式使用前缀来给出类型的信息——例如,dw为DWORD,w为WORD。
如果您在网上搜索”匈牙利符号”,您会发现很多关于匈牙利符号是好还是坏的意见。一些程序员对匈牙利符号极为不满。其他人觉得很有帮助。无论如何,MSDN上的许多代码示例都使用匈牙利符号,但是您不需要记住前缀来理解代码。
下一个
使用字符串