Универсальные текстовые сопоставления в файле Tchar.h
Чтобы упростить преобразование кода для многоязыковых приложений, в библиотеке времени выполнения Microsoft имеются относящиеся к Microsoft универсальные текстовые сопоставления для большинства типов данных, стандартных процедур и других объектов.Эти сопоставления определены в файле Tchar.h и могут использоваться для написания универсального кода, который можно скомпилировать в однобайтовой кодировке, многобайтовой кодировке или в кодировке Юникод (в зависимости от значения константы манифеста, определенной с помощью директивы #define).Универсальные текстовые сопоставления представляют собой расширения Microsoft, несовместимые со стандартами ANSI.
С помощью файла заголовков Tchar.h можно создавать приложения, использующие однобайтовую кодировку, многобайтовую кодировку или кодировку Юникод, из одних исходных файлов.В файле Tchar.h определяются макросы с префиксом _tcs, который при использовании правильных определений препроцессора обеспечивают соответствующее сопоставление с функциями str, _mbs или wcs.Чтобы построить версию приложения с многобайтовой кодировкой, определите символ _MBCS.Чтобы построить версию приложения Юникод, определите символ _UNICODE.Чтобы построить версию приложения с однобайтовой кодировкой, не определяйте символ (по умолчанию).В приложениях MFC по умолчанию определен символ _MBCS.
Тип данных _TCHAR определяется в файле Tchar.h условно.Если при построении определен символ _UNICODE, тип данных _TCHAR определяется как wchar_t. В противном случае (для сборок с однобайтовой и многобайтовой кодировкой) этот тип определяется как char.(Базовый тип данных wchar_t, обеспечивающий поддержку двухбайтовых знаков Юникод, является 16-битным аналогом 8-битного типа char со знаком.) Для многоязыковых приложений следует использовать функции семейства _tcs, в которых используются знаки _TCHAR, а не байты.Например, с помощью функции _tcsncpy выполняется копирование n знаков _TCHARs, а не n байтов.
Поскольку в некоторых функциях обработки строк с однобайтовой кодировкой принимаются параметры char* (со знаком), при определении символа _MBCS отображается предупреждение компилятора о несоответствии типов.Этого предупреждения можно избежать тремя способами.
Использование встроенных типобезопасных преобразователей функций, содержащихся в файле Tchar.h.Это поведение установлено по умолчанию.
Использование макроса перехода, содержащегося в файле Tchar.h, посредством определения символа _MB_MAP_DIRECT в командной строке.В этом случае необходимо выполнить сопоставление типов вручную.Этот способ является наиболее быстрым, однако не обеспечивает типобезопасность.
Использование типобезопасных встроенных преобразователей функций статической библиотеки, содержащихся в файле Tchar.h.Для этого определите в командной строке константу _NO_INLINING.Этот способ является наиболее медленным, однако обеспечивает типобезопасность.
Директивы препроцессора для универсальных текстовых сопоставлений
# define |
Скомпилированная версия |
Пример |
---|---|---|
_UNICODE |
Юникод(двухбайтовые знаки) |
_tcsrev сопоставляется функции _wcsrev |
_MBCS |
Многобайтовая кодировка |
_tcsrev сопоставляется функции _mbsrev |
Нет (по умолчанию не определен ни символ _UNICODE, ни символ _MBCS) |
однобайтовая кодировка (ASCII) |
_tcsrev сопоставляется функции strrev |
Например, определенная в файле Tchar.h универсальная текстовая функция _tcsrev сопоставляется функции _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 для строк в формате Юникод, поскольку в них скорее всего содержатся встроенные пустые байты.По тем же причинам не следует использовать функции семейства wcs для строк с однобайтовой или многобайтовой кодировкой. |
В следующих примерах кода показано использование функций _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);
Таким образом, можно создавать, обслуживать и компилировать единый исходный файл кода, который будет выполняться с процедурами, использующими любую из трех описанных выше кодировок.