如何为TCHAR数组赋值 我在C++代码中有一个 TCHAR < /Cord>数组,我想给它分配静态字符串。

如何为TCHAR数组赋值 我在C++代码中有一个 TCHAR < /Cord>数组,我想给它分配静态字符串。,c++,tchar,C++,Tchar,我通过设置一个初始字符串 TCHAR myVariable[260] = TEXT("initial value"); 这一切都很好。但是,当我把它分成两行时 TCHAR myVariable[260]; myVariable = TEXT("initial value"); 它会出现错误并出现编译器错误: 错误C2440:“=”:无法从“常量字符[14]”转换为“TCHAR[260]” TEXT()?将给定字符串转换为TCHARs?当把这两条线放在一起时,它为什么起作用?为了让它工作,我必

我通过设置一个初始字符串

TCHAR myVariable[260] = TEXT("initial value");
这一切都很好。但是,当我把它分成两行时

TCHAR myVariable[260];
myVariable = TEXT("initial value");
它会出现错误并出现编译器错误:

错误C2440:“=”:无法从“常量字符[14]”转换为“TCHAR[260]”

TEXT()?将给定字符串转换为
TCHAR
s?当把这两条线放在一起时,它为什么起作用?为了让它工作,我必须改变什么

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


我在互联网上搜索过它,发现还有
\u T()
\u TEXT()
\u T()
\u TEXT()
。它们是干什么用的?我应该在什么环境下使用它们中的哪一个?

作业不起作用的原因与
TCHAR
s和
\u t
关系不大。下面的方法也行不通

char var[260];
var = "str";   // fails
原因是C和C++中不能直接分配数组。相反,您必须逐个复制元素(例如,使用
strcpy
,或者在您的情况下使用
\u tcscpy

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

请参阅以获得直接答案。我本想补充这一点作为评论,但这确实是一个独立的建议。我将警告您,这听起来像是一种咆哮,但它确实来自于使用
TCHAR
,然后在试图将其从一个相当大的代码库中删除之前处理了几年的问题

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

  • sizeof(TCHAR)
    是有条件的:仔细检查包含此项的代码。如果它只是在计算传递给
    malloc()
    memcpy()
    的大小,那么它可能是错误的
  • TCHAR
    是一个类型别名
    :由于
    TCHAR
    只不过是一个
    typedef
    ,因此编写类似于
    wcscpy(tszStr,wszAry)
    的东西非常容易,而且一点也不明智。基本上,
    TCHAR
    要么是
    char
    要么是
    wchar\t
    ,因此重载选择可能会让您感到惊讶
  • wsprintf()
    swprintf()
    是不同的
    :这是前一种情况的特例,但需要特别考虑,因为在这里很容易出错
如果要使用
TCHAR
,请确保定期编译UNICODE和MBCS版本。如果你不这样做,那么你可能会放弃你试图通过使用它们来获得的任何优势

<> P>这里有两个建议,我在编写C++代码时首先不使用<代码> TCHAR 。
  • 如果您正在使用MFC,或者可以轻松地将自己绑定到MSFT,请使用
  • std::string
    std::wstring
    与特定类型的API结合使用-在适当的情况下使用
    CreateFileA()
    CreateFileW()

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

    +1,我最初考虑过写一篇类似的文章。就我个人而言,我总是对utf-8编码的数据使用
    std::string
    ,只在API边界(即调用win32 API之前)重新编码。@avakar:我们已经完成了utf-8+std::string和UCS-2+std::wstring方法。我选择了后者,因为在Unicode中,大小写折叠和比较比UTF-8.+1到avakar要容易得多。请注意,使用TCHAR而不是WCHAR或char,具体取决于您的项目设置(Unicode/ASCII),TCHAR宏将定义为WCHAR/char。同样,使用基于安全的函数,如_tcscpy_s、_tcscat_s等,这些函数将根据您的项目再次定义。设置为wcscpy或strcpy。我的2美分。我尝试了这个,得到了这个错误:错误C2664:“wcscpy”:无法将参数2从“const char[8]”转换为“const wchar\u t*”@user396483,尝试了什么?很明显,您将str、tcs和wcs版本混合在一起。
    strcpy(var, "str");