ANSI和Unicode中的_T ,TCHAR,LPTSTR,LPCTSTR的具体区别与实例解析

阳光岛主
博客专家认证
2009-12-17 07:28:35
我想知道ANSI和Unicode中的_T ,TCHAR,LPTSTR,LPCTSTR的具体区别与实例解析?谢谢

以下是我刚学到了,但仍然不太明白_T是宏,主要是如何定义的,如何使用?
宏_T与TCHAR有什么具体的、实际的区别?

微软提供了一些兼容的通用数据类型,我们最常用的数据类型有_T ,TCHAR,LPTSTR,LPCTSTR。
  顺便说一下,LPCTSTR和const TCHAR*是完全等同的。其中L表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的,在Win32 中以及其它的32位操作系统中,long指针和near指针及far修饰符都是为了兼容的作用,没有实际意义。P(pointer)表示这是一个指针;C(const)表示是一个常量;T(_T宏)表示兼容ANSI和Unicode,STR(string)表示这个变量是一个字符串。综上可以看出,LPCTSTR表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。比如:

TCHAR* szText=_T(“Hello!”);
TCHAR szText[]=_T(“I Love You”);
LPCTSTR lpszText=_T(“大家好!”);

...全文
365 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
阳光岛主 2010-01-06
  • 打赏
  • 举报
回复
解释的很详尽通俗,而且总结的很全面,也很便于我学习理解和记忆应用,非常感谢您的回答 ^_^[Quote=引用 2 楼 swq1982 的回复:]
LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义:

LPSTR:32bit指针 指向一个字符串,每个字符占1字节

LPCSTR:32-bit指针 指向一个常字符串,每个字符占1字节
LPCTSTR:32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
LPTSTR:32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义

Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。

WindowsNT的所有与字符有关的函数都提供两种方式的版本,而Windows9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello"。如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律UNICODE方式保存.


文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/20090403/163954.html)
[/Quote]
阳光岛主 2010-01-06
  • 打赏
  • 举报
回复
简明清晰易懂,对我学习理解内部的定义很有用,非常感谢啦[Quote=引用 1 楼 fox000002 的回复:]
都是宏,可以认为是这样定义的

C/C++ code#ifdef _UNICODE#define T(x) L ## x

typedef wchar_t TCHAR;#else /* ndef _UNICODE */#define T(x)

typedefchar TCHAR;#endif// _UNICODE
[/Quote]
swq1982 2009-12-18
  • 打赏
  • 举报
回复
LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义:

LPSTR:32bit指针 指向一个字符串,每个字符占1字节

LPCSTR:32-bit指针 指向一个常字符串,每个字符占1字节
LPCTSTR:32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
LPTSTR:32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义

Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。

WindowsNT的所有与字符有关的函数都提供两种方式的版本,而Windows9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello"。如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律UNICODE方式保存.


文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/20090403/163954.html)
fox000002 2009-12-18
  • 打赏
  • 举报
回复
都是宏,可以认为是这样定义的

#ifdef  _UNICODE

#define T(x) L ## x

typedef wchar_t TCHAR;

#else /* ndef _UNICODE */

#define T(x)

typedef char TCHAR;
#endif // _UNICODE

7,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧