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


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

Если определена константа манифеста _MBCS, используемые в коде универсальные текстовые функции отображаются на процедуры одного из следующих видов:

  • SBCS-версии процедур, которые обрабатывают многобайтовые байты, знаки и строки соответствующим образом. В этом случае ожидается, что строковые аргументы будут иметь тип char*. Например, функция _tprintf отображается на функцию printf; строковые аргументы printf имеют тип char*. При использовании универсального строкового типа данных _TCHAR типы формальных и фактических параметров функции printf совпадают, потому что _TCHAR* отображается на char*.

  • MBCS-версии процедур. В этом случае ожидается, что строковые аргументы будут иметь тип unsigned char*. Например, функция _tcsrev отображается на функцию _mbsrev, которая ожидает и возвращает строку типа unsigned char*. При использовании универсального строкового типа данных _TCHAR существует вероятность конфликта типов, потому что _TCHAR отображается на тип char.

Есть три способа предотвратить конфликт типов (при конфликте типов компилятор C выдает предупреждение, а компилятор C++ — сообщение об ошибке):

  • Использовать поведение по умолчанию. Файл Tchar.h содержит прототипы универсальных текстовых процедур, реализованных в библиотеках времени выполнения, как показано в следующем примере.

    char * _tcsrev(char *);
    

    В этом случае прототип функции _tcsrev отображается на функцию _mbsrev через преобразователь в Libc.lib. Тип входного параметра и результата функции _mbsrev изменяется с _TCHAR * (то есть с char *) на unsigned char *. Данный метод гарантирует совпадение типов при использовании _TCHAR, но он является сравнительно медленным из-за дополнительного вызова функции.

  • Использовать подстановку функций путем включения в код следующей инструкции препроцессора.

    #define _USE_INLINING
    

    При этом подходе вызывается встроенный преобразователь функции, реализованный в файле Tchar.h, который непосредственно отображает универсальную текстовую процедуру на соответствующую MBCS-процедуру. Следующий фрагмент кода из Tchar.h иллюстрирует вышесказанное.

    __inline char *_tcsrev(char *_s1)
    {return (char *)_mbsrev((unsigned char *)_s1);}
    

    По возможности рекомендуется использовать именно подставляемые функции, потому что они гарантируют соответствие типов и не замедляют код.

  • Использовать прямое отображение путем включения в код следующей инструкции препроцессора.

    #define _MB_MAP_DIRECT
    

    Данный подход является быстрой альтернативой, если нет возможности использовать поведение по умолчанию или подставляемые функции. При этом универсальная текстовая процедура отображается через макрос непосредственно на MBCS-версию процедуры, как в следующем фрагменте из Tchar.h.

    #define _tcschr _mbschr
    

    При использовании этого подхода необходимо следить, чтобы для строковых входных параметров и выходного значения использовались соответствующие типы данных. Можно воспользоваться явным приведением типов, чтобы гарантировать соответствие типов, либо универсальным строковым типом данных _TXCHAR. Тип _TXCHAR отображается на тип char в SBCS-коде, но в MBCS-коде он отображается на тип unsigned char. Дополнительные сведения об универсальных текстовых макросах см. в разделе Универсальные текстовые отображения справки по библиотеке времени выполнения.

См. также

Основные понятия

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