如何在不使用TEXT()的字符串文字的情况下为TCHAR *赋值?

时间:2015-12-01 00:28:28

标签: c++ string text macros tchar

我需要在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?

1 个答案:

答案 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
}