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

  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;    
View Code

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

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

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

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

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

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

 

原文地址:https://www.cnblogs.com/JeffreyCheung/p/5765947.html