Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При определении константы _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сопоставления с_mbsrevthunk в 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. Дополнительные сведения о макросах универсального текста см. в разделе "Сопоставления универсального текста" в справочнике по библиотеке времени выполнения.