16

我的 C++ 代码中有一个TCHAR数组,我想为其分配静态字符串。

我通过

TCHAR myVariable[260] = TEXT("initial value");

一切正常。但是,当我将它分成两行时

TCHAR myVariable[260];
myVariable = TEXT("initial value");

它出现错误并给出编译器错误:

错误 C2440:“=”:无法从“const char [14]”转换为“TCHAR [260]”

TEXT()功能不应该完全符合我的要求吗?将给定的字符串转换为TCHARs? 为什么将两条线放在一起时它会起作用?为了让它工作,我必须改变什么?

我遇到的其他一些令人困惑的事情:

我已经在互联网上搜索了它,并且看到还有_T()and_TEXT()__T()and __TEXT()。它们是干什么用的?我应该在什么环境中使用它们中的哪一个?

4

2 回答 2

21

赋值不起作用的原因与TCHARs 和_T. 以下也不起作用。

char var[260];
var = "str";   // fails

原因是在 C 和 C++ 中,您不能直接分配数组。相反,您必须一个一个地复制元素(例如,使用strcpy,或在您的情况下_tcscpy)。

strcpy(var, "str");

关于您问题的第二部分TEXT_T和其他部分是宏,在 Unicode 构建中将字符串文字转换为宽字符串文字。在非 Unicode 版本中,它们什么都不做。

于 2009-10-10T12:24:08.140 回答
4

有关直接答案,请参见avakar 的答案。我打算将此添加为评论,但这确实是一个独立的建议。我会警告你,这听起来像是一个咆哮,但它确实来自使用TCHAR和工作了几年的问题,然后试图从一个相当大的代码库中删除它。

确保您真正了解使用TCHAR数组及其朋友的效果。它们看似难以正确使用。以下是您必须注意的事项的简短列表:

  • sizeof(TCHAR)是有条件的:仔细检查包含这个的代码。如果它在计算传递给的大小以外的其他任何事情,malloc()那么memcpy()它可能是错误的。
  • TCHAR是一个类型别名:因为TCHAR只不过是 a typedef,所以写出类似的东西真的很容易,wcscpy(tszStr, wszAry)而且一点也不聪明。基本上,要么是TCHAR这样,要么是这样的重载选择可能会让你大吃一惊。 charwchar_t
  • wsprintf()swprintf()不同:这是前面的一个特例,但需要特别考虑,因为这里很容易出错!

如果要使用TCHAR,请确保定期编译UNICODEMBCS 版本。如果您不这样做,那么您可能会取消您试图通过首先使用它们获得的任何优势。

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

  1. 如果您使用CStringMFC 或愿意将自己绑定到 MSFT,请使用。
  2. 使用std::stringstd::wstring与特定类型的 API 结合使用 -CreateFileA()CreateFileW()适当的情况下使用。

就个人而言,我选择后者,但字符编码和字符串转码问题有时只是一场噩梦。

于 2009-10-10T14:28:41.323 回答