我的C ++代码中有一个TCHAR
数组,我想为它分配静态字符串。
我通过
为它设置了一个初始字符串TCHAR myVariable[260] = TEXT("initial value");
这一切都很好。但是,当我将它分成两行时,如
TCHAR myVariable[260];
myVariable = TEXT("initial value");
它出错并给出编译器错误:
错误C2440:'=':无法从'const char [14]'转换为'TCHAR [260]'
TEXT()
函数不应该完全符合我的要求吗?将给定的字符串转换为TCHAR
s?将两条线放在一起时,为什么会起作用?我需要更改什么才能使其正常工作?
我遇到过其他令人困惑的事情:
我在互联网上搜索了它,并且看到还有_T()
和_TEXT()
以及__T()
和__TEXT()
。它们适用于什么?我应该在什么环境中使用哪一个?
答案 0 :(得分:21)
分配不起作用的原因与TCHAR
和_T
几乎没有关系。以下内容也不起作用。
char var[260];
var = "str"; // fails
原因是在C和C ++中,您无法直接分配数组。相反,您必须逐个复制元素(例如,使用strcpy
,或在您的情况下_tcscpy
)。
strcpy(var, "str");
关于问题的第二部分,TEXT
,_T
和其他是宏,在Unicode构建中将字符串文字转换为宽字符串文字。在非Unicode版本中,它们什么都不做。
答案 1 :(得分:5)
有关直接答案,请参阅avakar's answer。我打算将其添加为评论,但它确实是一项独立推荐。我会警告你,这听起来像是一个咆哮,但它确实来自于使用
TCHAR
然后工作问题几年,然后尝试从相当大的代码库中删除它。
确保您真正了解使用TCHAR
数组及其朋友的效果。它们看起来很难正确使用。以下是您需要注意的事项的简短列表:
sizeof(TCHAR)
是有条件的:仔细检查包含此内容的代码。如果它除了计算传递给malloc()
或memcpy()
的大小之外还做了其他任何事情,那么它可能是错误的。TCHAR
是类型别名:由于TCHAR
只是typedef
,因此编写wcscpy(tszStr, wszAry)
之类的内容非常简单并且不是更聪明的人。基本上,TCHAR
char
或wchar_t
,因此过载选择可能会让您感到惊讶。wsprintf()
和swprintf()
不同:这是前一个特例,但需要特别注意,因为在这里犯错很容易!如果您想使用TCHAR
,请确保定期编译两者 UNICODE和MBCS版本。如果你不这样做,那么你可能会首先使用它们来取消你想要获得的任何优势。
以下是关于在编写C ++代码时如何不首先使用TCHAR
的两条建议。
CString
。std::string
或std::wstring
与特定类型的API结合使用 - 在适当情况下使用CreateFileA()
和CreateFileW()
。就个人而言,我选择后者,但字符编码和字符串转码问题不时只是一场噩梦。