在c ++中将字符串转换为_T

时间:2011-07-25 10:20:52

标签: c++ windows

我想将stringchar*转换为_T但无法做到。

如果我写

_tcscpy(cmdline,_T ("hello world")); 

它完美无缺,但如果我写的话

char* msg="hello world";
_tcscpy(cmdline,_T (msg));

它显示如下错误:error C2065: 'Lmsg' : undeclared identifier

请给我一个解决方案。

提前完成。

6 个答案:

答案 0 :(得分:10)

_T是一个宏,定义为(如果定义了UNICODE):

#define _T(a)  L ## a

只能使用字符串文字。因此,当您编写_T("hi")时,它变为L"hi",这是有效的,正如预期的那样。但是当你写_T(msg)时,它变为Lmsg,这是一个未定义的标识符,你并不打算这样做。

您需要的只是此函数mbstowcs

const char* msg="hello world"; //use const char*, instead of char*
wchar_t *wmsg = new wchar_t[strlen(msg)+1]; //memory allocation
mbstowcs(wmsg, msg, strlen(msg)+1);

//then use wmsg instead of msg
_tcscpy(cmdline, wmsg);

//memory deallocation - must do to avoid memory leak!
 delete []wmsg;

答案 1 :(得分:3)

_T仅适用于字符串文字。如果代码是使用Unicode支持编译的话,它所做的只是将文字转换为L""字符串,否则就不管它。

查看http://msdn.microsoft.com/en-us/library/dybsewaf(v=vs.80).aspx

答案 2 :(得分:2)

您需要使用mbtowcs功能。

您还应该查看this article

答案 3 :(得分:2)

_T是一个宏,它通过在L版本中的文字前面加UNICODE来使字符串文字成为宽字符串文字。

换句话说,当您编写_T("Hello")时,就好像您已在ANSI版本上编写"Hello"或在UNICODE版本上编写L"Hello"。结果表达式的类型分别为char*wchar_t*

_T 无法将字符串变量std::stringchar*)转换为wchar_t* - 为此,您必须使用mbstowcsMultiByteToWideChar等函数。

建议:对于您(并且绝不会更糟)总是进行UNICODE构建并忘记_TTCHAR和所有其他{{} {1}} - 衍生物。只需在任何地方使用宽字符串。

答案 4 :(得分:2)

_T不是实际类型。这是一个宏,它使用L添加字符串文字,这样它们就是wchar_t*而不是char*。如果您需要在运行时将char*字符串转换为wchar_t*字符串,则需要mbtowcs

答案 5 :(得分:1)

_T修饰符只是一个声明,告诉编译器必须将字符串文字解释为utf-16编码。它不适用于变量的原因是因为该变量的内容已经声明为ascii。

如前所述,mbstowcs函数是执行将char数据转换为utf-16(宽字符)数据所需的函数。