Tchar c что это
Перейти к содержимому

Tchar c что это

  • автор:

Универсальные текстовые сопоставления в файле tchar.h

Чтобы упростить перенос кода для международного использования, библиотека времени выполнения Майкрософт предоставляет сопоставления универсального текста майкрософт для многих типов данных, подпрограмм и других объектов. Эти сопоставления, определенные в tchar.h, можно использовать для написания универсального кода, который можно скомпилировать для однобайтовых, многобайтовых или юникодовых наборов символов в зависимости от константы манифеста, определяемой с помощью инструкции #define . Универсальные текстовые сопоставления представляют собой расширения Microsoft, несовместимые со стандартами ANSI.

Используя tchar.h, вы можете создавать однобайтовые, многобайтовые символьные наборы (МБ CS) и приложения Юникода из одного источника. tchar.h определяет макросы (которые имеют префикс _tcs ), которые с правильными определениями препроцессора, сопоставлением с str , _mbs или wcs функциями, соответствующим образом. Чтобы создать МБ CS, определите символ _MBCS . Чтобы создать Юникод, определите символ _UNICODE . Чтобы создать однобайтовое приложение, определите ни однобайтовое приложение (по умолчанию). По умолчанию _UNICODE определяется для приложений MFC.

Тип _TCHAR данных определяется условно в tchar.h. Если символ _UNICODE определен для сборки, _TCHAR определяется как wchar_t ; в противном случае для однобайтовых и МБ CS сборок он определяется как char . ( wchar_t базовый тип данных в формате Юникода — это 16-разрядный аналог 8-разрядного signed char .) Для международных приложений используйте _tcs семейство функций, которые работают в _TCHAR единицах, а не в байтах. Например, _tcsncpy копирует n _TCHARs , а не n байты.

Так как некоторые функции обработки строкового набора байтов (SBCS) принимают (подписанные) char* параметры, при _MBCS определении определяется несоответствие типов компилятору. Существует три способа избежать этого предупреждения:

  1. Используйте встроенные функции с безопасностью типа в tchar.h. Это поведение принимается по умолчанию.
  2. Используйте прямые макросы в tchar.h, определив _MB_MAP_DIRECT в командной строке. После этого необходимо сопоставить типы вручную. Это самый быстрый метод, но не является типобезопасной.
  3. Используйте функцию библиотеки, безопасную для типов, статическую привязку библиотеки в tchar.h. Для этого необходимо определить константу _NO_INLINING в командной строке. Это самый медленный и в то же время самый типобезопасный способ.

Директивы препроцессора для универсальных текстовых сопоставлений

# определение Скомпилированная версия Пример
_UNICODE Юникод (расширенные символы) _tcsrev соответствует _wcsrev
_MBCS Многобайтовые символы _tcsrev соответствует _mbsrev
Нет (значение по умолчанию не _UNICODE определено) _MBCS Однобайтовая кодировка (ASCII) _tcsrev соответствует strrev

Например, функция универсального текста _tcsrev , определяемая в tchar.h, сопоставляется с _mbsrev тем, определена ли в _MBCS программе или _wcsrev если определена _UNICODE . В противном случае _tcsrev сопоставляется с strrev . Другие сопоставления типов данных предоставляются в tchar.h для удобства программирования, но _TCHAR наиболее полезны.

Сопоставления типов данных универсального текста

Универсальный текст
Имя типа данных
_UNICODE &
_МБ CS не определен
_MBCS
Определено
_UNICODE
Определено
_TCHAR char char wchar_t
_TINT int unsigned int wint_t
_TSCHAR signed char signed char wchar_t
_TUCHAR unsigned char unsigned char wchar_t
_TXCHAR char unsigned char wchar_t
_T или _TEXT Не действует (удаляется препроцессором) Не действует (удаляется препроцессором) L (преобразует следующий символ или строку в его аналог Юникода)

Список универсальных текстовых сопоставлений подпрограмм, переменных и других объектов см. в справочнике по библиотеке времени выполнения.

Не используйте str семейство функций со строками Юникода, которые, скорее всего, содержат внедренные байты NULL. Аналогичным образом не используйте wcs семейство функций со строками МБ CS (или SBCS).

В следующих примерах кода показано использование функций _TCHAR и _tcsrev для сопоставления моделям многобайтовой кодировки, Юникод и однобайтовой кодировки.

_TCHAR *RetVal, *szString; RetVal = _tcsrev(szString); 

Если _MBCS этот фрагмент определен, препроцессор сопоставляет этот фрагмент с этим кодом:

char *RetVal, *szString; RetVal = _mbsrev(szString); 

Если _UNICODE этот фрагмент определен, препроцессор сопоставляет этот фрагмент с этим кодом:

wchar_t *RetVal, *szString; RetVal = _wcsrev(szString); 

Если ни один из них не _MBCS _UNICODE определен, препроцессор сопоставляет фрагмент с кодом ASCII с одним байтом, как показано ниже.

char *RetVal, *szString; RetVal = strrev(szString); 

Таким образом, можно создавать, поддерживать и компилировать файл одно исходного кода для выполнения с подпрограммами, характерными для любого из трех типов символьных наборов.

LPSTR, LPWSTR, TCHAR, char*, .

TCHAR — это изобретение Microsoft и куча проблем с ним связано. Если у вас проект на Unicode, то это TCHAR = wchar_t. Если ASCII то TCHAR = char.

#ifdef _UNICODE typedef wchar_t TCHAR; #else typedef char TCHAR; #endif http://www.pvsm.ru/unicode/23896 

Поскольку TCHAR в исходниках примеров драйверов повсюду надо понимать как с ним далее работать. Как следствие надо использовать Windows Safe String Function для разных преобразований:

присвоить значение TCHAR строке :

TCHAR str[100]; StringCchCopy(str, ARRAYSIZE(str), L"127.0.0.1"); /* STRSAFEAPI StringCchCopyA( STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszSrc ); */ 

Если надо int в TCHAR преобразовать (int -> TCHAR):

TCHAR str[100]; StringCchPrintf(str, ARRAYSIZE(str), TEXT("%d"), (int)number); 

присваивание значений строкам

"строка ANSI"; // ANSI L"строка Unicode"; // Unicode TEXT("строка ANSI|Unucode по ситуации как и с TCHAR") _T = TEXT 

LPCSTR понимается так.
• LP — Long Pointer (длинный указатель)
• C – Constant (константа)
• STR – String (строка)
По сути LPCSTR это (Длинный) указатель на строку.

LPSTR общеприменяемый префикс с названии sz

typedef char* LPSTR; 

LPCWSTR,LPWSTR описан так:

typedef const WCHAR* LPCWSTR; typedef WCHAR* LPCWSTR; 

LPCTSTR
LP — Long Pointer (Длинный указатель)
C — Constant (Константа)
T = TCHAR
STR = String (Строка)

Что такое STRSAFE? Смотрим strsafe.h :

typedef __nullterminated char* STRSAFE_LPSTR; typedef __nullterminated const char* STRSAFE_LPCSTR; typedef __nullterminated wchar_t* STRSAFE_LPWSTR; typedef __nullterminated const wchar_t* STRSAFE_LPCWSTR; typedef __nullterminated const wchar_t UNALIGNED* STRSAFE_LPCUWSTR; 

Там же в strsafe.h :

#ifdef UNICODE #define StringCchCopy StringCchCopyW #else #define StringCchCopy StringCchCopyA #endif // !UNICODE #ifdef UNICODE #define StringCchPrintf StringCchPrintfW #else #define StringCchPrintf StringCchPrintfA #endif // !UNICODE 

Скопировать TCHAR* в char* (универсальный вариант)

TCHAR ourIpAdress[100]; char *ipAddres = new char[256]; int cbMultiByte = WideCharToMultiByte(CP_ACP,0,ourIpAdress,sizeof(ourIpAdress),ipAddres,sizeof(ipAddres),NULL,NULL); 

wcstombs(ipAddres, ourIpAdress, sizeof(ourIpAdress)); к сожалению только если UniCode исползуется

Tchar c что это

Рейтинг (т): 530

tchar не связан непосредственно с переносимостью между исполнительными платформами. Его задача – обеспечить переносимость между ANSI и UNICODE. Самый простой вариант в этом аспекте – просто не использовать юникод как базу. Тем более, что реализаций юникода существует более одной.
Переносимость между исполнительными платформами достигается избавлением от использования любых предположений об их характеристиках. В частности от API операционной системы. Кросс-платформенное ПО использует исключительно стандартные библиотеки, являющиеся частью языка и описываемые Стандартом языка, а также библиотеки третьих сторон, которые тоже кросс-платформенны.

Сообщ. #5 , 16.04.15, 19:05

Tchar c что это

Здравствуйте, уважаемые господа.

Я, конечно, понимаю, что уже надоел всем, кто тут только есть, однако кому задавать подобные вопросы, к сожалению, больше не знаю вообще.

— Какая разница между TCHAR и _TCHAR?

— Есть ли разница между TEXT и _T?

— Есть ли аналоги функции getch () или _getch ()?

— Прав. ли я понял, что самый оптимальный вариант — использование _tmain вместо main и _t для различных функций, а остальные варианты теперь не нужны?

Заранее благодарю за возможные ответы.

Re: Использование TCHAR

От: Abyx
Дата: 10.06.11 15:57
Оценка: 1 (1)

Здравствуйте, YourLastSong, Вы писали:

YLS>- Прав. ли я понял, что самый оптимальный вариант — использование _tmain вместо main и _t для различных функций, а остальные варианты теперь не нужны?

_t* макросы нужны если собираетесь делать две версии приложения — с юникодом и без него.
период перехода на юникод вроде как уже закончился и сейчас делать два бинарника это как-то странно %)

In Zen We Trust
Re[2]: Использование TCHAR

От: YourLastSong
Дата: 10.06.11 16:11
Оценка:

A>_t* макросы нужны если собираетесь делать две версии приложения — с юникодом и без него.

Тогда лучше использовать wchar_t или как?

Кстати, вы не могли бы объяснить как можно более подробно, что такое LPCSTR, LPCTSTR и т.д.? Когда их лучше использовать?

Re[3]: Использование TCHAR

От: Abyx
Дата: 10.06.11 16:17
Оценка:

Здравствуйте, YourLastSong, Вы писали:

YLS>Тогда лучше использовать wchar_t или как?
всё просто: надо использовать wchar_t там где надо использовать wchar_t, и char во всех остальных случаях.

YLS>Кстати, вы не могли бы объяснить как можно более подробно, что такое LPCSTR, LPCTSTR и т.д.? Когда их лучше использовать?
это макросы.
LPCSTR можно никогда не использовать, и писать const char*.
LPCTSTR нужен там же где и TCHAR

In Zen We Trust
Re[4]: Использование TCHAR

От: VladFein
Дата: 10.06.11 18:34
Оценка: 1 (1)

Здравствуйте, Abyx, Вы писали:

A>всё просто: надо использовать wchar_t там где надо использовать wchar_t, и char во всех остальных случаях.

или надо использовать char там где надо использовать char, и wchar_t во всех остальных случаях.

Re[3]: Использование TCHAR

От: баг
Дата: 11.06.11 03:32
Оценка:

Здравствуйте, YourLastSong, Вы писали:

YLS>Тогда лучше использовать wchar_t или как?
TCHAR нужен был раньше, когда собирали приложения с поддержкой юникода и без оного (NT+ vs 9x). Сейчас проще всегда юникод собирать.

YLS>Кстати, вы не могли бы объяснить как можно более подробно, что такое LPCSTR, LPCTSTR и т.д.? Когда их лучше использовать?
Windows data types

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *