Verwenden von TCHAR.H-Datentypen in _MBCS-Code

Wenn die Manifestkonstante _MBCS definiert ist, wird eine bestimmte generische Textroutine einer der folgenden Arten von Routinen zugeordnet:

  • Eine SBCS-Routine, die ordnungsgemäß Multibytes, Zeichen und Zeichenfolgen verarbeitet. In diesem Fall werden Zeichenfolgenargumente vom Typ char* erwartet. Beispielsweise wird _tprintfprintf zugeordnet; die Zeichenfolgenargumente für printf sind vom Typ char*. Wenn Sie generischen Text vom Datentyp _TCHAR für Ihre Zeichenfolgentypen verwenden, stimmen die formalen und tatsächlichen Parametertypen für printf überein, da _TCHAR*char* zugeordnet wird.

  • Eine MBCS-spezifische Routine. In diesem Fall werden Zeichenfolgenargumente vom Typ unsigned char* erwartet. Beispielsweise wird _tcsrev_mbsrev zugeordnet, wobei eine Zeichenfolge vom Typ unsigned char* erwartet und zurückgegeben wird. Wenn Sie den _TCHAR Generischen Text-Datentyp für Ihre Zeichenfolgentypen verwenden, gibt es einen potenziellen Typkonflikt, da _TCHAR der Typ zugeordnet charist.

Im Folgenden werden drei Lösungen vorgestellt, um einen solchen Typenkonflikt (und die daraus resultierenden C-Compilerwarnungen oder C++-Compilerfehler) zu verhindern:

  • Verwendet das Standardverhalten. tchar.h stellt Prototypen für generische Textroutinen für Routinen in den Laufzeitbibliotheken bereit, wie im folgenden Beispiel gezeigt.

    char * _tcsrev(char *);
    

    Im Standardfall, der Prototyp für _tcsrev Karten bis zu _mbsrev einem Thunk in Libc.lib. Dadurch werden die Typen der _mbsrev eingehenden Parameter und der ausgehende Rückgabewert von _TCHAR* (d. h char *. ) in unsigned char *. Diese Methode stellt den Typabgleich bei Der Verwendung _TCHARsicher, ist aber aufgrund des Funktionsaufrufaufwands relativ langsam.

  • Verwenden Sie Inlinefunktionen, indem Sie die folgende Präprozessoranweisung in Ihren Code integrieren.

    #define _USE_INLINING
    

    Diese Methode bewirkt, dass eine Inlinefunktion thunk, die in tchar.h bereitgestellt wird, die generische Textroutine direkt der entsprechenden MBCS-Routine zuzuordnen. Der folgende Codeauszug aus tchar.h enthält ein Beispiel dafür, wie dies geschieht.

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

    Wenn Sie Inlining verwenden können, ist dies die beste Lösung, da es Typübereinstimmung sicherstellt und keinen zusätzlichen Zeit- oder Kostenaufwand mit sich bringt.

  • Verwenden Sie die direkte Zuordnung, indem Sie die folgende Präprozessor-Anweisung in Ihren Code integrieren.

    #define _MB_MAP_DIRECT
    

    Dieser Ansatz bietet eine schnelle Alternative, wenn Sie das Standardverhalten nicht verwenden möchten oder kein Inlining verwenden können. Sie bewirkt, dass die generische Textroutine von einem Makro direkt der MBCS-Version der Routine zugeordnet wird, wie im folgenden Beispiel von tchar.h.

    #define _tcschr _mbschr
    

    Wenn Sie diesen Ansatz anwenden, müssen Sie darauf achten, dass geeignete Datentypen für Zeichenfolgenargumente und Zeichenfolgenrückgabewerte verwendet werden. Um eine ordnungsgemäße Typübereinstimmung sicherzustellen, können Sie die Typumwandlung oder generischen Text vom Datentyp _TXCHAR verwenden. _TXCHAR wird Typ char im SBCS-Code zugeordnet, jedoch Typ unsigned char im MBCS-Code. Weitere Informationen zu generischen Textmakros finden Sie unter Generic-Text-Zuordnungen in der Laufzeitbibliotheksreferenz.

Siehe auch

Zuordnungen für generischen Text in tchar.h