如何为TCHAR数组赋值

时间:2009-10-10 12:13:53

标签: c++ tchar

我的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()。它们适用于什么?我应该在什么环境中使用哪一个?

2 个答案:

答案 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 charwchar_t,因此过载选择可能会让您感到惊讶。
  • wsprintf()swprintf()不同:这是前一个特例,但需要特别注意,因为在这里犯错很容易!

如果您想使用TCHAR,请确保定期编译两者 UNICODE和MBCS版本。如果你不这样做,那么你可能会首先使用它们来取消你想要获得的任何优势。

以下是关于在编写C ++代码时如何不首先使用TCHAR的两条建议。

  1. 如果您使用的是MFC或使用MSFT,请使用CString
  2. std::stringstd::wstring与特定类型的API结合使用 - 在适当情况下使用CreateFileA()CreateFileW()
  3. 就个人而言,我选择后者,但字符编码和字符串转码问题不时只是一场噩梦。