• 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宏来表示字面量字符或者字符串。

     

  • 相关阅读:
    金蝶K3 账套复制
    silverlight控件如何自适应
    一个使用Jquery写的一个鼠标拖动效果
    如何使用C#开发“类ActiveX组件”
    一个非科班出身程序员的成长历程
    Ubuntu 12.04下LAMP安装配置
    Abp vue项目找不到模块“./app.vue”
    google的分析(analytics)js代码分析以及重写
    javascript实现类似google和msn space的拖拽
    Lucene.Net, SQL Server 2008全文检索, Like模糊查询的一点心得
  • 原文地址:https://www.cnblogs.com/JeffreyCheung/p/5765947.html
Copyright © 2020-2023  润新知