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

前端之家收集整理的这篇文章主要介绍了c – 使用TCHAR的错误,无法转换为wchar_t前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我被要求为现有的旧项目添加功能,但我无法构建它.
它处理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”).

任何建议都会非常感激.

解决方法

代码已编写为目标Unicode而不是MBCS.这可以通过使用接受类型为const wchar_t *的参数的wcscmp来识别.

另一方面,有部分代码使用TCHAR和相关的宏.现在,TCHAR是一个宏,它解析为char或wchar_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“..”.用wmain替​​换tmain.用wchar_t替换TCHAR.等等.

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

猜你在找的C&C++相关文章