永发信息网

_T()的参数可以是变量吗?

答案:6  悬赏:30  手机版
解决时间 2021-11-29 23:38
  • 提问者网友:容嬷嬷拿针来
  • 2021-11-29 07:00
_T()的参数可以是变量吗?
最佳答案
  • 五星知识达人网友:话散在刀尖上
  • 2021-11-29 08:00
_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。
全部回答
  • 1楼网友:走死在岁月里
  • 2021-11-29 11:42
_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变量。再不行补基础去吧。
  • 2楼网友:怙棘
  • 2021-11-29 11:03
用TCHAR型的变量才可以追问我的变量是ANSI的,如何转化为TCHAR变量?
注意我追加悬赏了。
如果我原来:
a="可以";
是否可以用:
b=TCHAr(a);// ?
  • 3楼网友:躲不过心动
  • 2021-11-29 09:56
用指针啊...

char * str//当然也可以用数组...如char str[];

===============================================
#include
#include
int main(int argc, char * argv[])
{
char str[]="Hello World";
MessageBox(NULL,TEXT(str),TEXT("Hi"),MB_OK);
return -1;
}
//看我这个例子是否能帮你帮你一下吧....供参考...^_^
  • 4楼网友:一叶十三刺
  • 2021-11-29 09:13
这位仁兄好像对CHAR 与 TCHAR的区别还搞不太明白嘛,这是基本的常识了。
其实推荐答案的那位已经说了很清楚了,我不知道为什么你还不明白。

首先C++只有两种字符, char 与 wchar_t
前者为单字符,后者为宽字符。 而TCHAR 要么表示 char, 要么表示 wchat_t,这取决于项目的设置。

将char 转换到 wchar_t 需要转码,是使用 Win32 API:MultiByteToWideChar。

_T() 宏 要么什么也不做,要么在常量串前面加上前导的L,这是C++标准规定的,在字符数组字面量前加L时字符数组即为wchar_t类型。

还有什么不明白的?追问你解释了_T() 的意思,这个我在提问前就已明白。
不明白的是:如何将ANSI格式的字符串变量(不是常量),变成TCHAR格式。
推荐答案的那位已经回答了:
#ifdef UNICODE
MultiByteToWideChar(...);
#endif
后来我又追加了新问题,因此也相应追加悬赏,现在是105分了。
  • 5楼网友:独行浪子会拥风
  • 2021-11-29 08:10
不可以,_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)追问如果_T()不能用字符串变量,那么该用哪个函数或者宏呢?追答首先要确认字符串变量是ANSI编码还是Unicode编码,其次确定你的程序是要使用ANSI还是Unicode。
如果是ANSI转Unicode,用 MultiByteToWideChar
如果是Unicode转ANSI,用 WideCharToMultiByte追问是ANSI转TCHAR,不是转ANSI或Unicode追答TCHAR只是个宏,要先确认是ANSI还是Unicode啊,如果是你自己的工程,是ANSI还是Unicode自己知道吧,如果是传给别的程序的,别的程序是使用ANSI还是Unicode也很好确定啊,如果是传给Windows的API的,还是看你自己的程序是否定义了 UNICODE宏。
可以这样
#ifdef UNICODE

MultiByteToWideChar(...);

#endif追问我在“问题补充”中说了:是输入法编程。
输入法,是为各种应用程序服务的,例如写字板、记事本、浏览器、电子邮件等等需要打汉字的任何软件。对方是是ANSI还是Unicode是无法知道的。
(LPCTSTR)a的方式是否可以?(假设a="可以";)
#ifdef UNICODE
MultiByteToWideChar(...);
#endif追答(LPCTSTR)a只是强制转了指针类型,字符串内容是不会变回的。

输入法怎么编的我不了解,但你字符串是如何传给别的程序的,如果是用API传,比如用SendMessage发送一个字符串到一个Edit控件,Windows的API都有ANSI和Unicode两套版本的,用哪套都可以,因为是用API传不管对方程序是什么编码都能正确传过去。取决于你自己的工程是使用Unicode还是ANSI,如果你不确定你的工程是Unicode还是Ansi,就用我上面的#ifdef方法。追问谢谢。
但我的感觉是,这两套版本好像是针对常量的,变量好像不行。
我平时只会用ANSI,因此我程序里的变量都是ANSI的,只是到了最后“临门一脚”要把汉字串送往用户应用程序的时候,才转换为TCHAR。
以前,我修改别人的输入法,把送往应用程序的汉字串之前加一个_T("家"),效果就像我预想的那样,在打“拖拉机”的时候打出“家拖拉机”。
现在轮到自己编程,发现不能用_T(),因此到这里来问可以改用什么函数或宏追答首先VC添加了TCHAR,_T()这些定义是为了能写同时兼容UNICODE和ANSI的代码,他们的兼容是采用编译期识别的方式,在UNICODE和ANSI的不同版本下分别对应不同的C++类型。运行期的字符串没有哪个函数是可以直接判断是什么编码的。
你说加一个_T("家"),光这个是不知道是L"家"还是“家”,所以不知道你要传的是UNICODE还是ANSI。
你对很多概念理解还是有偏差,所以问题可能也没说清楚。你说“我不知道如何把ANSI转换为TCHAR”这本身就是一个模糊的问题,TCHAR可以是UNICODE也可以是ANSI,如果已经是ANSI那还有什么好转的,如果你问的是如果把ANSI转UNICODE就是MultiByteToWideChar。如果你是问如何在运行期确定TCHAR是UNICODE还是ANSI,这是个伪命题,TCHAR没有运行期意义。追问我在改别人程序时,刚开始是用ANSI的“家”,结果失败。后来改为 不知道是L"家"还是“家”的_T("家"),才成功。
看了你的回答,我似乎明白:程序中虽然不确定_T("家")是ANSI还是UNICODE,但在编译时却是确定的,因此编译出的.exe、.dll文件,要么只能输出ANSI格式,要么只能输出UNICODE格式,不能按应用程序的要求而改变。
假如只能输出UNICODE格式,那么那些只接受ANSI格式的应用程序,打出的是乱码。是这样吗?追答问题是你的字符串是通过什么传给应用程序的?API还是什么?输入法我不了解。追问大概通过API。输入法我也不了解,先看别人的程序,每个语句都加注解,这样硬啃了8个月。
目前的理解是:输入法是个DLL。送往应用程序的键盘消息A被系统(大概就是API吧?)拦下,然后系统发消息B通知输入法程序,输入法程序接到B后对A进行预处理。处理出的汉字串送往系统所指定的地址,然后发出消息通知应用程序去那个地址接收。
我在别人程序整理出汉字即将送出时,在前面添_T“家”成功,意味着我能随意更改,获得了信心追答那你就用unicode送好了。应用程序没有所谓只接受什么格式的,unicode只是你编译期一种约定,一个程序也可以同时使用ANSI和unicode两种字符串。既然能接受输入系统内会转换的,不会有乱码,关键是送的时侯要求是什么编码。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯