Использование типов данных TCHAR.H с кодом _MBCS
При определении константы _MBCS
манифеста данная подпрограмма универсального текста сопоставляется с одним из следующих типов подпрограмм:
Подпрограмма для однобайтовой кодировки, которая правильно обрабатывает многобайтовые символы и строки. В этом случае ожидается, что строковые аргументы будут иметь тип
char*
. Например, функция_tprintf
сопоставляется с функциейprintf
; строковые аргументы функцииprintf
имеют типchar*
. При использовании универсального строкового типа данных_TCHAR
типы формальных и фактических параметров функцииprintf
совпадают, потому что_TCHAR*
сопоставляется сchar*
.Подпрограмма, специально созданная для многобайтовой кодировки. В этом случае ожидается, что строковые аргументы будут иметь тип
unsigned char*
. Например, функция_tcsrev
сопоставляется с функцией_mbsrev
, которая ожидает и возвращает строку типаunsigned char*
. Если для строковых типов используется универсальный_TCHAR
текстовый тип данных, существует потенциальный конфликт типов, так как_TCHAR
сопоставляется с типомchar
.
Есть три способа предотвратить такой конфликт типов (и избежать предупреждений компилятора C или ошибок компиляции C++).
Использовать поведение по умолчанию. tchar.h предоставляет прототипы универсальных текстовых подпрограмм для подпрограмм в библиотеках времени выполнения, как показано в следующем примере.
char * _tcsrev(char *);
В случае по умолчанию прототип для
_tcsrev
сопоставления с_mbsrev
thunk в 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
в коде с однобайтовой кодировкой, но в коде с многобайтовой кодировкой он сопоставляется с типомunsigned char
. Дополнительные сведения о макросах универсального текста см. в разделе "Сопоставления универсального текста" в справочнике по библиотеке времени выполнения.