Меня попросили добавить функциональность в существующий старый проект, но я не могу заставить его строить.
Он обрабатывает 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. Это можно заметить по использованию 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
, То, что вы получаете, это ясность. Вы перестаете использовать эти макросы и избегаете запутывания, которое они предоставляют. Непрямое движение — отличный инструмент, но если оно не нужно, оно просто приводит к путанице и запутыванию.
Похоже, вы не создаете свое приложение для Unicode, поэтому проверьте настройки вашего проекта.
Если вы используете широкие строковые функции, такие как wcscmp
тогда нет смысла использовать _T()
макрос как ваш, не скомпилируется при компиляции в не-Unicode режиме. Если вы хотите, чтобы код компилировался в обоих режимах, когда вам нужно использовать TCHAR
осведомленные функции в <tchar.h>
такие как _tcscmp .
Если вы всегда хотите, чтобы строка была широкой, поместите L
на от, например L"Hello, world"
Если вы используете Visual Studio, установите Набор символов в Используйте набор символов Unicode под проектом Свойства конфигурации.
Я думаю, что вы могли бы использовать #define UNICODE, но обязательно сделайте это, прежде чем включать любые.