使用 TCHAR 时出错,无法转换为 wchar_t

Posted

技术标签:

【中文标题】使用 TCHAR 时出错,无法转换为 wchar_t【英文标题】:Errors using TCHAR,cannot convert to wchar_t 【发布时间】:2014-02-11 00:44:08 【问题描述】:

有人要求我向现有的旧项目添加功能,但我无法构建它。 它处理 unicode 字符串,但我在使用 TCHAR 时遇到很多错误。特别是几乎每个错误都是 TCHAR 无法转换为或用作 wchar_t。 从我在许多不同的文章中看到的情况来看,我尝试使用#define _UNICODE 或#define UNICODE,但它们都没有解决问题。

这是一段代码:

#include <windows.h>
#include <wininet.h>
#include <tchar.h>
#include <iostream>
#include <fstream>
#include <strsafe.h>
#include <string>
#include <list>
#include <cctype>
#include <winnt.h>
#include <atlconv.h>

#pragma comment(lib,"wininet.lib")

using namespace std;

TCHAR *tags[] =  _T("aa"), _T("bb"), _T("cc"),
NULL ;

int _tmain(int argc, _TCHAR* argv[])



int i = 0;


for (i = 1; i<argc; i++)  
    if (wcscmp(argv[i], _T("-h")) == 0) 
        ...
    
    else if (wcscmp(argv[i], _T("-f")) == 0) 
        ...
    


...

例如,在上面的行中,当使用 wcscmp 时,我得到了

    argument of type "_TCHAR *" is incompatible with parameter of type "const wchar_t *"

关于 argv[i]

    argument of type "const char *" is incompatible with parameter of type "const wchar_t *"

关于 _T("-h")。

任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

代码已针对 Unicode 而不是 MBCS 编写。这可以通过使用wcscmp 来识别,它接受const wchar_t* 类型的参数。

另一方面,部分代码使用TCHAR 和相关宏。现在,TCHAR 是一个宏,可以解析为 charwchar_t,具体取决于是否定义了 _UNICODE_MBCS。详情请咨询documentation。

TCHAR 的使用源于开发人员希望为 Windows NT/2000(支持 ANSI 和 Unicode API)和 Windows 95/98(只有 ANSI API)编写代码的日子。 TCHAR 的使用允许一个通用的代码库。使用为 NT/2000 定义的_UNICODE 编译,并使用为 95/98 定义的_MBCS 编译。

如果你用这种风格编码,那么你写_tcscmp而不是wcscmp。对于 Unicode 构建,它解析为 wcscmp,对于 MBCS 构建,它解析为 _mbscmp

如今,您通常不需要编写代码来支持 95/98。您可能会选择忽略这些平台。在这种情况下,您应该针对 Unicode 并停止使用 TCHAR 和相关宏。将_T("..") 替换为L".."。将tmain 替换为wmain。将TCHAR 替换为wchar_t。以此类推。

您无需进行这些更改。您可以简单地以 Unicode 为目标,您的代码将编译。但是,TCHAR 成语在您的代码库中的应用不一致。请注意_tmainTCHAR 的使用,以及对wcscmp 的调用。因此,除非以 Unicode 为目标,否则您的代码无法编译。因此,放弃TCHAR 并不会造成任何损失。你得到的是清晰。您可以停止使用这些宏并避免它们提供的所有混淆。间接是一个很好的工具,但如果不需要它,它只会导致混乱和混淆。

【讨论】:

非常好的答案!我真的想知道这种编码是否真的有必要。谢谢大卫!【参考方案2】:

您似乎没有为 Unicode 构建应用程序,因此请检查您的项目设置。

如果您使用像wcscmp 这样的宽字符串函数,那么使用_T() 宏没有任何意义,因为在非Unicode 模式下编译时您的com 将无法编译。当您需要使用&lt;tchar.h&gt; 中的TCHAR 感知函数如_tcscmp 时,如果您希望代码在这两种模式下编译。

如果您总是希望字符串变宽,则在 from 处放置 L,例如 L"Hello, world"

【讨论】:

感谢您的帮助。更改设置可以解决问题,所以我想知道您所说的是否有我想在非 Unicode 模式下编译的情况? @yiannis 我试图在我的回答中解决这个问题。我认为您应该做的不仅仅是切换到 Unicode 定位。我认为您应该摆脱使用不一致的令人困惑的TCHAR 成语。【参考方案3】:

如果您使用的是 Visual Studio,请将 字符集 设置为 使用 Unicode 字符集 在项目 配置属性 下。

我认为您可以使用#define UNICODE,但请确保在任何包含之前使用它。

【讨论】:

以上是关于使用 TCHAR 时出错,无法转换为 wchar_t的主要内容,如果未能解决你的问题,请参考以下文章

vs2013 如何将string字符串转换成数字形式

在windows下的QT编程中的_TCHAR与QString之间的转换

关于 char wchar_t TCHAR _T() ||| 宏 _T TEXT _TEXT L

char 转wchar_t 及wchar_t转char

在 VC++ 中将 TCHAR 转换为 LPWSTR?

如何将char*转换为wchar