Windows 编程中恼人的各种字符以及字符指针类型

在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"中:

 //windef.h
typedef unsigned long ULONG;
typedef ULONG *PULONG;
typedef unsigned short USHORT;
typedef USHORT *PUSHORT;
typedef unsigned char UCHAR;
typedef UCHAR *PUCHAR;
typedef char *PSZ; typedef UINT WPARAM;
typedef LONG LPARAM;
typedef LONG LRESULT; typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef float FLOAT;
typedef FLOAT *PFLOAT;
typedef BOOL near *PBOOL;
typedef BOOL far *LPBOOL;
typedef BYTE near *PBYTE;
typedef BYTE far *LPBYTE;
typedef int near *PINT;
typedef int far *LPINT;
typedef WORD near *PWORD;
typedef WORD far *LPWORD;
typedef long far *LPLONG;
typedef DWORD near *PDWORD;
typedef DWORD far *LPDWORD;
typedef void far *LPVOID;
typedef CONST void far *LPCVOID; typedef int INT;
typedef unsigned int UINT;
typedef unsigned int *PUINT; //winnt.h
typedef char CHAR;
typedef short SHORT;
typedef long LONG; #ifndef _MAC typedef unsigned short wchar_t;
typedef wchar_t WCHAR; typedef WCHAR *PWCHAR;
typedef WCHAR *LPWCH, *PWCH;
typedef CONST WCHAR *LPCWCH, *PCWCH;
typedef WCHAR *NWPSTR;
typedef WCHAR *LPWSTR, *PWSTR; typedef CONST WCHAR *LPCWSTR, *PCWSTR; //
// ANSI (Multi-byte Character) types
//
typedef CHAR *PCHAR;
typedef CHAR *LPCH, *PCH; typedef CONST CHAR *LPCCH, *PCCH;
typedef CHAR *NPSTR;
typedef CHAR *LPSTR, *PSTR;
typedef CONST CHAR *LPCSTR, *PCSTR; //
// Neutral ANSI/UNICODE types and macros
//
#ifdef UNICODE // r_winnt #ifndef _TCHAR_DEFINED
typedef WCHAR TCHAR, *PTCHAR;
typedef WCHAR TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */ typedef LPWSTR LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR LPCTSTR;
typedef LPWSTR LP;
#define __TEXT(quote) L##quote // r_winnt #else /* UNICODE */ // r_winnt #ifndef _TCHAR_DEFINED
typedef char TCHAR, *PTCHAR;
typedef unsigned char TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */ typedef LPSTR LPTCH, PTCH;
typedef LPSTR PTSTR, LPTSTR;
typedef LPCSTR LPCTSTR;
#define __TEXT(quote) quote // r_winnt #endif /* UNICODE */ // r_winnt
#define TEXT(quote) __TEXT(quote) // r_winnt typedef SHORT *PSHORT;
typedef LONG *PLONG;

从这些类型定义以及宏定义不难看出,Windows中基本上只是用大写字母来代替。

Windows编程中,最常见的莫过于文章开头提到的那些数据类型了,其实仔细观察,不难发现,LP代表的是"Long Pointer",及长指针,W代表Wide,宽字节,C代表CONST,即常量指针,代表该指针指向的内容只能读取,不能修改。TSTR则代表TCHAR。

对于如何选择使用何种表示类型,除了开发者的自身习惯外,Windows给出的建议是:

1 使用通用数据类型TCHAR来表示文本字符和字符串;

2 用明确的数据类型,如BYTE来表示字节,字节指针以及数据缓冲区;

3 使用_T宏来表示字面量字符或者字符串。

上一篇:Treap详解


下一篇:传输层TCP和UDP