Поделиться через


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

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

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

Тип _TCHAR данных определяется условно в tchar.h. Если символ _UNICODE определен для сборки, _TCHAR он определен как wchar_t; в противном случае для однобайтовых и MBCS сборок он определяется как 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 &
_MBCS Не определен
_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 семейство функций со строками MBCS (или 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);

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

См. также

Текст и строки
Использование типов данных TCHAR.H с кодом _MBCS