为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

3 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

_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。


查看完整回答
反对 回复 2022-08-08
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

_T是为了让编译器按照将字符串按照wchar_t类型处理。编译器处理"data.txt"默认当成ASCII字符处理的,_T的话当成wchar_t处理。
比如下面的例子:
wchar_t sz[]=_T("data.txt");//从ASCII转换为wchar_t
file.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变量。再不行补基础去吧。


查看完整回答
反对 回复 2022-08-08
?
慕神8447489

TA贡献1780条经验 获得超1个赞

不可以,_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)

查看完整回答
反对 回复 2022-08-08
  • 3 回答
  • 0 关注
  • 214 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号