Использование типов данных 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. Дополнительные сведения об универсальных текстовых макросах см. в разделе Универсальные текстовые отображения справки по библиотеке времени выполнения.