如何在不使用带有 TEXT() 的字符串文字的情况下为 TCHAR* 赋值?
How do I assign a value to TCHAR* without using a string literal with TEXT()?
我需要在 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* 变量?
TEXT()
宏仅适用于编译时的文字。对于非文字数据,您必须改为执行运行时转换。
如果为项目定义了 UNICODE
,TCHAR
将映射到 wchar_t
,并且您必须使用 MultiByteToWideChar()
(或等效项)将您的 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*
:
char* example = "example";
TCHAR* otherName = example;
我建议使用 C++ 字符串来帮助您:
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
}
char* example = "example";
std::basic_string<TCHAR> otherName = toTCHAR(example);
我需要在 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* 变量?
TEXT()
宏仅适用于编译时的文字。对于非文字数据,您必须改为执行运行时转换。
如果为项目定义了 UNICODE
,TCHAR
将映射到 wchar_t
,并且您必须使用 MultiByteToWideChar()
(或等效项)将您的 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*
:
char* example = "example";
TCHAR* otherName = example;
我建议使用 C++ 字符串来帮助您:
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
}
char* example = "example";
std::basic_string<TCHAR> otherName = toTCHAR(example);