如果_T()不能用字符串变量,那么该用哪个函数或者宏呢?

说一下我的目的。
我在搞输入法编程。平时习惯用ANSI。现在牵扯到TCHAR不知该咋办。输入法送往应用程序的字符串要求是TCHAR的,我不知道如何把ANSI转换为TCHAR。以前都用_T()转换,但是现在遇到参数是变量,不知该怎么办。有啥方法吗?例如(TCHAR)a或者(LPCTSTR)a的方式?

狐的传说
浏览 215回答 3
3回答

神不在的星期二

_T()其实是一个宏,UNICODE时为L,非UNICODE则为空,而L是修饰常量字符串的。_T()的参数不可以是变量定义:_T("")是一个宏,定义于tchar.h下。#define __T(x) L ## x#define _T(x) __T(x)作用:他的作用是让程序支持Unicode编码,因为Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理像中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。如果编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管是以什么方式编译,一律以UNICODE方式保存。LPSTR:32bit指针指向一个字符串,每个字符占1字节LPCSTR:32-bit指针指向一个常字符串,每个字符占1字节LPCTSTR:32-bit指针指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义LPTSTR:32-bit指针每字符可能占1字节或2字节,取决于Unicode是否定义L是表示字符串资源为Unicode的。比如wchar_tStr[] = L"Hello World!";这个就是双字节存储字符了。_T是一个适配的宏~当#ifdef _UNICODE的时候_T就是L没有#ifdef _UNICODE的时候_T就是ANSI的。比如LPTSTR lpStr = new TCHAR[32];TCHAR* szBuf = _T("Hello");以上两句使得无论是在UNICODE编译条件下还是在ANSI编译条件下都是正确编译的。而且MS推荐使用相匹配的字符串函数。比如处理LPTSTR或者LPCTSTR的时候,不要用strlen ,而是要用_tcslen否则在UNICODE的编译条件下,strlen不能处理wchar_t*的字符串。T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。

幕布斯7119047

_T是为了让编译器按照将字符串按照wchar_t类型处理。编译器处理"data.txt"默认当成ASCII字符处理的,_T的话当成wchar_t处理。比如下面的例子:wchar_t sz[]=_T("data.txt");//从ASCII转换为wchar_tfile.Open(sz,CFile::modeRead);请看定义:#define _T(x) __T(x)#define __T(x) L ## x_T(a)用宏替换后变成 L## a,a不是字符串,是变量名,无法编译器报错。_T("123")用宏替换后变成 L##"123",编译器发现"L##"标识后按wchar_t类型处理字符串。要会自己发掘MFC代码。我只是想说楼主你基础不够,就再说得直白点了,MFC中wchar_t就是为处理Unicode字符使用的,一个字符2个字节,ASCII一个字符1个字节,这些都是在编译阶段就得确定的。_T("123")按照宽字符处理后占用6字节的内存,按照默认的ACSII方式处理占用3个字节。如果你想将ASCII表示汉子转换为Unicode编码也不是不行。MFC为了支持不同的语言将ASCII的后面128到255共128个切割出来,通过两两组合的方式来对应到某个汉子,将汉子码提取出来找到然后计算出Unicode编码存入wchar_t变量。再不行补基础去吧。

慕神8447489

不可以,_T()其实是一个宏,UNICODE时为L,非UNICODE则为空,而L是修饰常量字符串的。如_T("123")相当于L"123",字符串变量是无法用L修饰的,字符串指针定义可用LPTSTR(或LPCTSTR),在UNICODE时相当于WCHAR*(或const WCHAR*),非UNICODE时相当于char*。例如LPCTSTR pStr = _T("123");相当于const WCHAR* pStr = L"123";(UNICODE) 或const char* pStr = "123";(非UNICODE)
打开App,查看更多内容
随时随地看视频慕课网APP