Ошибки, использующие 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»).

Любые предложения будут очень признательны.

6

Решение

Код был написан для целевой Unicode, а не MBCS. Это можно заметить по использованию wcscmp который принимает параметры типа const wchar_t*,

С другой стороны, есть части кода, которые используют TCHAR и связанные макросы. Сейчас, TCHAR это макрос, который разрешает либо char или же wchar_t в зависимости от того, _UNICODE или же _MBCS определены. Проконсультируйтесь с документация Больше подробностей.

Использование TCHAR Происходит из тех дней, когда разработчики хотели писать код как для Windows NT / 2000 (которая поддерживала API-интерфейсы ANSI и Unicode), так и для Windows 95/98 (которая имеет только API-интерфейсы ANSI). Использование TCHAR допускается общая кодовая база. Компилировать с _UNICODE определяется для NT / 2000 и компилируется с _MBCS определено для 95/98.

Если вы код в этом стиле, то вы пишете _tcscmp скорее, чем wcscmp, Для сборки Unicode это решает wcscmpи для сборки MBCS он разрешается в _mbscmp,

В наши дни вам обычно не нужно писать код для поддержки 95/98. Вы, вероятно, можете игнорировать эти платформы. В этом случае вы должны нацелить Unicode и прекратить использование TCHAR и связанные макросы. замещать _T("..") с L"..", замещать tmain с wmain, замещать TCHAR с wchar_t, И так далее.

Вам не нужно вносить эти изменения. Вы можете просто настроить таргетинг на Unicode, и ваш код скомпилируется. Тем не менее TCHAR идиома была применена непоследовательно в вашей кодовой базе. Обратите внимание на использование _tmain, TCHARно также звонки wcscmp, Таким образом, ваш код не может скомпилироваться, если он не нацелен на Unicode. Таким образом, вы ничего не теряете, отказавшись от TCHAR, То, что вы получаете, это ясность. Вы перестаете использовать эти макросы и избегаете запутывания, которое они предоставляют. Непрямое движение — отличный инструмент, но если оно не нужно, оно просто приводит к путанице и запутыванию.

9

Другие решения

Похоже, вы не создаете свое приложение для Unicode, поэтому проверьте настройки вашего проекта.

Если вы используете широкие строковые функции, такие как wcscmp тогда нет смысла использовать _T() макрос как ваш, не скомпилируется при компиляции в не-Unicode режиме. Если вы хотите, чтобы код компилировался в обоих режимах, когда вам нужно использовать TCHAR осведомленные функции в <tchar.h> такие как _tcscmp .

Если вы всегда хотите, чтобы строка была широкой, поместите L на от, например L"Hello, world"

2

Если вы используете Visual Studio, установите Набор символов в Используйте набор символов Unicode под проектом Свойства конфигурации.

Я думаю, что вы могли бы использовать #define UNICODE, но обязательно сделайте это, прежде чем включать любые.

1
По вопросам рекламы [email protected]