Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы упростить перенос кода для международного использования, библиотека времени выполнения (run-time) Microsoft предоставляет специфичные для Microsoft универсальные текстовые сопоставления для многих типов данных, процедур и других объектов. Эти сопоставления, определенные в 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. Существует три способа избежать этого предупреждения:
Используйте типобезопасные inline-функции thunks в tchar.h. Это поведение принимается по умолчанию.
Используйте прямые макросы в tchar.h, определив
_MB_MAP_DIRECTв командной строке. После этого необходимо сопоставить типы вручную. Это самый быстрый метод, но не является типобезопасным.Используйте функции-обертки, безопасные для типов, из статически связываемой библиотеки в tchar.h. Для этого необходимо определить константу
_NO_INLININGв командной строке. Это самый медленный и в то же время самый типобезопасный способ.
Директивы препроцессора для универсальных текстовых отображений
| # определение | Скомпилированная версия | Пример |
|---|---|---|
_UNICODE |
Юникод (расширенные символы) |
_tcsrev соответствует _wcsrev |
_MBCS |
Многобайтовые символы |
_tcsrev соответствует _mbsrev |
Нет (по умолчанию ни _UNICODE ни _MBCS не определено) |
SBCS (Однобайтовая кодировка) (ASCII) |
_tcsrev соответствует strrev |
Например, функция универсального текста _tcsrev, определяемая в tchar.h, сопоставляется с _mbsrev, если в вашей программе определено _MBCS, или с _wcsrev, если определено _UNICODE. В противном случае _tcsrev сопоставляется с strrev. Другие сопоставления типов данных предоставляются в tchar.h для удобства программирования, но _TCHAR наиболее полезны.
Сопоставления типов данных обобщённого текста
| Универсальный текст Имя типа данных |
_UNICODE & _MBCS Не определен |
_MBCS Определено |
_ЮНИКОД Определено |
|---|---|---|---|
_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 для сопоставления с моделями многобайтовой кодировки, Unicode и однобайтовой кодировки.
_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