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


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

См. также

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