使用TCHAR的错误,无法转换为wchar_t

时间:2014-01-21 12:14:04

标签: c++ wchar-t tchar

我被要求为现有的旧项目添加功能,但我无法构建它。 它处理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”)。

任何建议都会非常感激。

3 个答案:

答案 0 :(得分:9)

代码已编写为目标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}定义的_MBCS进行编译。

如果您使用此样式编码,则编写_tcscmp而不是wcscmp。对于Unicode构建,它会解析wcscmp,对于MBCS构建,它会解析为_mbscmp

这些天你通常不需要编写代码来支持95/98。您可以选择忽略这些平台。在这种情况下,您应该定位Unicode并停止使用TCHAR和相关的宏。将_T("..")替换为L".."。将tmain替换为wmain。将TCHAR替换为wchar_t。等等。

您无需进行这些更改。您可以简单地定位Unicode,您的代码将编译。但是,TCHAR惯用法在您的代码库中的应用不一致。请注意使用_tmainTCHAR,以及对wcscmp的调用。所以你的代码无法编译,除非它以Unicode为目标。所以你放弃TCHAR就没有失去任何东西。你获得的是清晰度。您可以停止使用这些宏并避免它们提供的所有混淆。间接是一个很好的工具,但如果不需要它,那么它只会导致混淆和混淆。

答案 1 :(得分:2)

看起来您没有为Unicode构建应用程序,因此请检查项目设置。

如果你正在使用像wcscmp那样的宽字符串函数,那么使用_T()宏是没有意义的,因为在非Unicode模式下编译时你的编译将无法编译。如果您希望在TCHAR <tchar.h> L中使用L"Hello, world"感知函数时,可以在两种模式下编译代码。

如果您总是希望字符串变宽,那么请在{{1}}

上放置{{1}}

答案 2 :(得分:1)

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

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