在Windows编程中,很容易见到这些数据类型:LPSTR,LPTSTR,LPCTSTR... 像很多童鞋一样,当初在学Windows编程的时候,对着些数据类型真的是丈二和尚,摸不着头脑,长时间不用就会想不起来。所以,下面就对此做一个总结。
首先,先来看一下ASCII编码和UNICODE编码的区别。下面是《Windows 程序设计》一书中对Unicode编码的说明:
简单地说,Unicode扩展自ASCII字符集。在严格的ASCII中,每个字符用7位表示,或者计算机上普遍使用的每字符有8位宽;而Unicode使用全16位字符集。
这使得Unicode能够表示世界上所有的书写语言中可能用于计算机通讯的字符、象形文字和其它符号。Unicode最初打算作为ASCII的补充,可能的话,
最终将代替它。考虑到ASCII是计算机中最具支配地位的标准,所以这的确是一个很高的目标。
可见,两者的区别在于:ASCII编码的一个字符(Chrater)在内存中占据一个字节(BYTE),而Unicode编码的字符中一个字符占两个字节。
接下来,我们看看Windows里面的一些常用数据类型。在Windows中数据类型的定义位于头文件"windef.h"和"winnt.h"中:
1 //windef.h 2 typedef unsigned long ULONG; 3 typedef ULONG *PULONG; 4 typedef unsigned short USHORT; 5 typedef USHORT *PUSHORT; 6 typedef unsigned char UCHAR; 7 typedef UCHAR *PUCHAR; 8 typedef char *PSZ; 9 10 typedef UINT WPARAM; 11 typedef LONG LPARAM; 12 typedef LONG LRESULT; 13 14 typedef unsigned long DWORD; 15 typedef int BOOL; 16 typedef unsigned char BYTE; 17 typedef unsigned short WORD; 18 typedef float FLOAT; 19 typedef FLOAT *PFLOAT; 20 typedef BOOL near *PBOOL; 21 typedef BOOL far *LPBOOL; 22 typedef BYTE near *PBYTE; 23 typedef BYTE far *LPBYTE; 24 typedef int near *PINT; 25 typedef int far *LPINT; 26 typedef WORD near *PWORD; 27 typedef WORD far *LPWORD; 28 typedef long far *LPLONG; 29 typedef DWORD near *PDWORD; 30 typedef DWORD far *LPDWORD; 31 typedef void far *LPVOID; 32 typedef CONST void far *LPCVOID; 33 34 typedef int INT; 35 typedef unsigned int UINT; 36 typedef unsigned int *PUINT; 37 38 //winnt.h 39 typedef char CHAR; 40 typedef short SHORT; 41 typedef long LONG; 42 43 #ifndef _MAC 44 45 typedef unsigned short wchar_t; 46 typedef wchar_t WCHAR; 47 48 typedef WCHAR *PWCHAR; 49 typedef WCHAR *LPWCH, *PWCH; 50 typedef CONST WCHAR *LPCWCH, *PCWCH; 51 typedef WCHAR *NWPSTR; 52 typedef WCHAR *LPWSTR, *PWSTR; 53 54 typedef CONST WCHAR *LPCWSTR, *PCWSTR; 55 56 // 57 // ANSI (Multi-byte Character) types 58 // 59 typedef CHAR *PCHAR; 60 typedef CHAR *LPCH, *PCH; 61 62 typedef CONST CHAR *LPCCH, *PCCH; 63 typedef CHAR *NPSTR; 64 typedef CHAR *LPSTR, *PSTR; 65 typedef CONST CHAR *LPCSTR, *PCSTR; 66 67 // 68 // Neutral ANSI/UNICODE types and macros 69 // 70 #ifdef UNICODE // r_winnt 71 72 #ifndef _TCHAR_DEFINED 73 typedef WCHAR TCHAR, *PTCHAR; 74 typedef WCHAR TBYTE , *PTBYTE ; 75 #define _TCHAR_DEFINED 76 #endif /* !_TCHAR_DEFINED */ 77 78 typedef LPWSTR LPTCH, PTCH; 79 typedef LPWSTR PTSTR, LPTSTR; 80 typedef LPCWSTR LPCTSTR; 81 typedef LPWSTR LP; 82 #define __TEXT(quote) L##quote // r_winnt 83 84 #else /* UNICODE */ // r_winnt 85 86 #ifndef _TCHAR_DEFINED 87 typedef char TCHAR, *PTCHAR; 88 typedef unsigned char TBYTE , *PTBYTE ; 89 #define _TCHAR_DEFINED 90 #endif /* !_TCHAR_DEFINED */ 91 92 typedef LPSTR LPTCH, PTCH; 93 typedef LPSTR PTSTR, LPTSTR; 94 typedef LPCSTR LPCTSTR; 95 #define __TEXT(quote) quote // r_winnt 96 97 #endif /* UNICODE */ // r_winnt 98 #define TEXT(quote) __TEXT(quote) // r_winnt 99 100 101 typedef SHORT *PSHORT; 102 typedef LONG *PLONG;
从这些类型定义以及宏定义不难看出,Windows中基本上只是用大写字母来代替。
Windows编程中,最常见的莫过于文章开头提到的那些数据类型了,其实仔细观察,不难发现,LP代表的是"Long Pointer",及长指针,W代表Wide,宽字节,C代表CONST,即常量指针,代表该指针指向的内容只能读取,不能修改。TSTR则代表TCHAR。
对于如何选择使用何种表示类型,除了开发者的自身习惯外,Windows给出的建议是:
1 使用通用数据类型TCHAR来表示文本字符和字符串;
2 用明确的数据类型,如BYTE来表示字节,字节指针以及数据缓冲区;
3 使用_T宏来表示字面量字符或者字符串。