我需要在C ++中为TCHAR *变量赋值,并且我被告知这是使用TEXT()宏完成的。但是,我发现在使用字符串文字时我只能这样做。
//This assignment uses a string literal and works
TCHAR* name = TEXT("example");
//This assignment uses a local variable and causes an error
char* example = "example";
TCHAR* otherName = TEXT(example);
如果不是因为TEXT()引用参数的值将由用户在运行时确定,那么这不会成为问题。因此,我需要将值存储在某种局部变量中并将其传递给TEXT()宏。我如何使用TEXT()而不是字符串文字来使用局部变量?或者是否有另一种方法可以将值分配给TCHAR * varible?
答案 0 :(得分:1)
TEXT()
宏仅适用于编译时的文字。对于非文字数据,您必须改为执行运行时转换。
如果为项目定义UNICODE
,则TCHAR
将映射到wchar_t
,您必须使用MultiByteToWideChar()
(或等效的)转换{{1} } {}到char*
缓冲区:
wchar_t
如果未定义char* example = "example";
int example_len = strlen(example);
int otherName_len = MultiByteToWideChar(CP_ACP, 0, example, example_len, NULL, 0);
TCHAR* otherName = new TCHAR[otherName_len+1];
MultiByteToWideChar(CP_ACP, 0, example, example_len, otherName, otherName_len);
otherName[otherName_len] = 0;
// use otherName as needed ...
delete[] otherName;
,则UNICODE
将映射到TCHAR
,您可以直接指定char
:
char*
我建议使用C ++字符串来帮助你:
char* example = "example";
TCHAR* otherName = example;
std::basic_string<TCHAR> toTCHAR(const std::string &s)
{
#ifdef UNICODE
std::basic_string<TCHAR> result;
int len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), s.length(), NULL, 0);
if (len > 0)
{
result.resize(len);
MultiByteToWideChar(CP_ACP, 0, s.c_str(), s.length(), &result[0], len);
}
return result;
#else
return s;
#endif
}