Универсальные текстовые сопоставления в файле 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
определении определяется несоответствие типов компилятору. Существует три способа избежать этого предупреждения:
Используйте встроенные функции с безопасностью типа в tchar.h. Это поведение принимается по умолчанию.
Используйте прямые макросы в tchar.h, определив
_MB_MAP_DIRECT
в командной строке. После этого необходимо сопоставить типы вручную. Это самый быстрый метод, но не является типобезопасной.Используйте функцию библиотеки, безопасную для типов, статическую привязку библиотеки в 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