zoukankan      html  css  js  c++  java
  • [笔记]LPSTR, LPCSTR, LPWSTR, LPCWSTR, LPTSTR, LPCTSTR, CString, TCHAR 的含义

    关于标题的问题,网上找了些文章,转帖在这里以作记录。

    在“delphi中关于LPCTSTR,LPTSTR,CSTRING,CHAR *等等的区别”中,写到:

    在vc++中有着各种字符串的表示法,首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
    LP的含义是长指针(long pointer)。LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
    为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
    LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。
    然后为了实现两种编码的通用,提出了TCHAR的定义:

    如果定义_UNICODE,声明如下:
    typedef wchar_t TCHAR;
    如果没有定义_UNICODE,则声明如下:
    typedef char TCHAR;

    LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。
    CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。

    在MSDN的“Data Type Mappings”中有表格如下:

    Generic-text data type nameSBCS (_UNICODE, _MBCS not defined)_MBCS defined_UNICODE defined
    _TCHAR char char wchar_t
    _tfinddata_t _finddata_t _finddata_t _wfinddata_t
    _tfinddata64_t __finddata64_t __finddata64_t __wfinddata64_t
    _tfinddatai64_t _finddatai64_t _finddatai64_t _wfinddatai64_t
    _TINT int int wint_t
    _TSCHAR signed char signed char wchar_t
    _TUCHAR unsigned char unsigned char wchar_t
    _TXCHAR char unsigned char wchar_t
    _T or _TEXT No effect (removed by preprocessor) No effect (removed by preprocessor) L (converts following character or string to its Unicode counterpart)

    在“如何理解LPCTSTR类型?”中有写到:

    L表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的, 在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。P表示这是一个指针,C表示是一个常量,T表示在Win32环境中,有一个_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏, 那么这个字符或者字符串将被作为UNICODE字符串, 否则就是标准的ANSI字符串。STR表示这个变量是一个字符串,所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。同样,LPCSTR就只能是一个ANSI字符串,在程序中我们大部分时间要使用带T的类型定义。

    C++ LPCTSTR  -> Delphi  const PChar;

    参考:

    1. delphi中关于LPCTSTR,LPTSTR,CSTRING,CHAR *等等的区别
      http://www.websnap123.com/show-TnpJNU56TXc=.html
    2. Data Type Mappings
      http://msdn.microsoft.com/en-us/library/se784sk6(vs.71).aspx
    3. 如何理解LPCTSTR类型?
      http://archlord.blog.hexun.com/7293951_d.html
  • 相关阅读:
    SAP dpmon
    SLD Connection Parameters for a Central SLD
    SDN有中文版论坛了
    XI Service Users
    甘特图终极版本 绝对B/S的甘特图经典
    xml文件net操纵类(c#)
    将js文件编译成动态链接库(dll)文件
    文件创建及读取的方法
    只能在执行 Render() 的过程中调用 RegisterForEventValidation(RegisterForEventValidation can only be called during Render()
    ASP.net AJAX置于框架中出现回调
  • 原文地址:https://www.cnblogs.com/journeyonmyway/p/2133860.html
Copyright © 2011-2022 走看看