【问题标题】:How to assign a value to a TCHAR array如何为 TCHAR 数组赋值
【发布时间】:2009-10-10 12:13:52
【问题描述】:

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

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

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

这一切都很好。但是,当我将它分成两行时,如

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

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

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

TEXT() 函数不应该完全符合我的要求吗?将给定的字符串转换为TCHARs?为什么将两条线放在一起时它会起作用?我必须进行哪些更改才能使其正常工作?

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

我在互联网上搜索过,发现还有_T()_TEXT()__T()__TEXT()。它们是干什么用的?我应该在什么环境中使用它们中的哪一个?

【问题讨论】:

    标签: c++ tchar


    【解决方案1】:

    分配不起作用的原因与TCHARs 和_T 关系不大。以下也不起作用。

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

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

    strcpy(var, "str");
    

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

    【讨论】:

    • +1 给阿凡卡。附带说明一下,使用 TCHAR 代替 WCHAR 或 char,这取决于您的项目设置(Unicode/ASCII),TCHAR 宏将被定义为 WCHAR/char。同样使用基于 _t 的安全函数,如 _tcscpy_s、_tcscat_s 等,这些函数将根据您的项目再次定义。设置为 wcscpy 或 strcpy。我的 2 美分。
    • 我试过这个,得到这个错误:错误 C2664: 'wcscpy' : cannot convert parameter 2 from 'const char [8]' to 'const wchar_t *'
    • @user396483,试过什么?您显然是在将 str、_tcs 和 wcs 版本混合在一起。
    【解决方案2】:

    请参阅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()

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

    【讨论】:

    • +1,我最初考虑写一篇类似的咆哮。就个人而言,我总是将std::string 与 utf-8 编码数据一起使用,仅在 API 边界重新编码(即在调用 win32 API 之前)。
    • @avakar:我们已经完成了 UTF-8+std::string 和 UCS-2+std::wstring 方法。我采用了后者,因为 Unicode 中的大小写折叠和比较比 UTF-8 容易得多。
    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多