zoukankan      html  css  js  c++  java
  • PSTR、LPSTR、PCSTR、LPCSTR、LPWSTR、PWSTR、PCWSTR、LPCWSTR、LPCTSTR

    https://blog.csdn.net/W343051232/article/details/7083276

    https://blog.csdn.net/jize00/article/details/4379478?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=6b477d38-54bd-45f5-af43-bbdc00b11ae3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

    不知道是不是ACM以来的习惯的问题,本人从来就是char*,wchar_t*,TCHAR*。。。不常用PSTR、LPSTR这些。。。

    下面做下简单总结

    1.  
      typedef char CHAR;
    2.  
      typedef wchar_t WCHAR;
    3.  
      #define CONST const
    1.  
      typedef CHAR* PCHAR,*PCH,*LPCH,*NPSTR,*PSTR,*LPSTR;
    2.  
      typedef CONST CHAR* PCCH,*LPCCH,*PCSTR,*LPCSTR;
    1.  
      typedef WCHAR *PWCHAR,*NWPSTR,*PWCH,*LPWCH,*PWSTR,*LPWSTR;
    2.  
      typedef CONST WCHAR* PCWCH,*LPCWCH,PCWSTR,LPCWSTR;
    1.  
      typedef /* [string] */ WCHAR __RPC_FAR *LPWSTR;
    2.  
       
    3.  
      typedef /* [string] */ TCHAR __RPC_FAR *LPTSTR;
    1.  
      typedef LPSTR LPTCH, PTCH;
    2.  
      typedef LPSTR PTSTR, LPTSTR;
    3.  
      typedef LPCSTR LPCTSTR;

    为了统一成大写,C++给char,wchar_t,const 取了个大写别名。

    理解以上的命名规则就可以记住每种别名带表什么意思

    N:代表near,在16位系统中代表16位的段内地址

    L:代表long(far),在16位系统中代表16位的段地址+16位的偏移地址

    在32位系统中 N和L已经没有作用,只是为了向前兼容(兼容16位机器)才保留这些定义。

    P:代表指针

    C:代表CONST(const)

    W:代表WCHAR(wchar_t)

    T:代表宏_T(一个兼容的宏,当定义了UNICODE或者_UNICODE是表示WCHAR,否则表示char)

    CH:char的简写

    STR:string的简写

    明白了以上每个字母代表什么含义之后,只要知道排列顺序即可。正则表达式:[L/N][P][C][W/T][CH/STR]

    突然发现 typedef也没用过几次。。。

    =-----------------------------------------------------------------------------

    首先在编译程序时经常会遇到这种问题:

    错误 1 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [3]”转换为“LPCTSTR”

    1、觉得很烦,一般的做法就是不管三七二十一,在字符串前面加一个‘L’:

    如调用函数FUN(LPCTSTR str)时,不能  FUN("HELLO");     而是FUN(L"HELLO");

    通常这样做都比较能解决问题。

    2、或者还可以用_T(), 即 FUN(_T("HELLO"));   _T() 的别名还有 _TEXT(), TEXT()。

    稍微研究了下,BSTR,LPSTR,LPWSTR,LPCTSTR,LPTSTR等这些让人头晕的东东。(还是C#里简单啊,直接tostring)

    BSTR:是一个OLECHAR*类型的Unicode字符串,是一个COM字符串,带长度前缀,与VB有关,没怎么用到过。

    LPSTR:即 char *,指向以'/0'结尾的8位(单字节)ANSI字符数组指针

    LPWSTR:即wchar_t *,指向'/0'结尾的16位(双字节)Unicode字符数组指针

    LPCSTR:即const char *

    LPCWSTR:即const wchar_t *

    LPTSTR:LPSTR、LPWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI

    LPCTSTR: LPCSTR、LPCWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI,如下是从MFC库中拷来的:

    #ifdef UNICODE

        typedef LPWSTR LPTSTR;

        typedef LPCWSTR LPCTSTR;

    #else

        typedef LPSTR LPTSTR;

        typedef LPCSTR LPCTSTR;

    #endif 

    3、相互转换方法:

    LPWSTR->LPTSTR:   W2T();
    LPTSTR->LPWSTR:   T2W();
    LPCWSTR->LPCSTR: W2CT();
    LPCSTR->LPCWSTR: T2CW();

    ANSI->UNICODE:     A2W();

    UNICODE->ANSI:     W2A();

    另外,CString转为CStringW方法(通过一个wchar_t数组来转)

     CString str;

     CStringW strw;
     wchar_t *text = new wchar_t[sizeof(wchar_t) * str.GetLength()];
     MultiByteToWideChar(CP_ACP,0,str,-1,text,str.GetLength());
     strw = text;

    4、另外,还可以强行转换,不过不一定能成功

    5、还有_bstr_t ( 对BTSTR的封装,需要#include<comdef.h> ),也可将单字节字符数组指针转为双字节字符数组指针,还没怎么没用到过。

    作者:疯狂Delphi
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

    欢迎关注我,一起进步!扫描下方二维码即可加我

  • 相关阅读:
    Golang---反射(reflect)
    golang--交替打印一个数组中的元素
    Golang---基本类型(interface)
    利用random5 生成 random7
    Golang---基本类型(map)
    Golang---基本类型(slice)
    Golang---基本类型(string)
    二维码扫码登录原理
    Golang---内存逃逸
    关于我
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/14441175.html
Copyright © 2011-2022 走看看