8

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

任何建议将不胜感激。

4

3 回答 3

13

该代码已针对 Unicode 而不是 MBCS 编写。这可以通过使用wcscmpwhich 接受类型参数来辨别const wchar_t*

另一方面,有部分代码使用TCHAR和相关的宏。现在,TCHAR是一个宏,它根据是否定义或被定义来解析char或解析。有关更多详细信息,请参阅文档wchar_t_UNICODE_MBCS

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

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

现在,您通常不需要编写代码来支持 95/98。您可能会选择忽略这些平台。在这种情况下,您应该以 Unicode 为目标并停止使用TCHAR和相关的宏。替换_T("..")L".."。替换tmainwmain。替换TCHARwchar_t。等等。

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

于 2014-01-21T13:18:08.587 回答
2

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

如果您使用的是宽字符串函数,wcscmp那么使用宏是没有意义的,_T()因为在非 Unicode 模式下编译时将无法编译。如果您希望代码在两种模式下编译时需要使用_tcscmpTCHAR感知函数。<tchar.h>

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

于 2014-01-21T12:26:18.930 回答
1

如果您使用的是 Visual Studio,请在项目Configuration Properties下将Character Set 设置Use Unicode Character Set

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

于 2014-01-21T12:36:19.910 回答