Zuordnungen für generischen Text in tchar.h

Zur Vereinfachung des Transports von Code für die internationale Verwendung stellt die Microsoft-Laufzeitbibliothek microsoftspezifische generische Textzuordnungen für viele Datentypen, Routinen und andere Objekte bereit. Sie können diese Zuordnungen verwenden, die in tchar.h definiert sind, um generischen Code zu schreiben, der für Einzelne-Byte-, Multibyte- oder Unicode-Zeichensätze kompiliert werden kann, abhängig von einer Manifestkonstante, die Sie mithilfe einer #define Anweisung definieren. Generische Textzuordnungen sind Microsoft-Erweiterungen, die nicht mit ANSI kompatibel sind.

Mithilfe von tchar.h können Sie Einzelbyte-, Multibyte-Zeichensatz (MBCS) und Unicode-Anwendungen aus denselben Quellen erstellen. tchar.h definiert Makros (die das Präfix _tcshaben), die entsprechend den korrekten Präprozessordefinitionen, str_mbszuordnungen oder Funktionen zugeordnet sindwcs. Definieren Sie zur Erstellung von MBCS das _MBCS-Symbol. Um Unicode zu erstellen, definieren Sie das Symbol _UNICODE. Um eine Einzelbyte-Anwendung zu erstellen, geben Sie nichts an (Standardeinstellung). Standardmäßig wird _UNICODE für MFC-Anwendungen definiert.

Der _TCHAR Datentyp wird bedingt in tchar.h definiert. Wenn das Symbol _UNICODE für Ihren Build definiert ist, _TCHAR wird es als wchar_tdefiniert; andernfalls wird es für Einzelbyte- und MBCS-Builds als chardefiniert. (wchar_tDer grundlegende Unicode-Breitzeichendatentyp ist das 16-Bit-Gegenstück zu einer 8-Bit-Version signed char.) Verwenden Sie für internationale Anwendungen die _tcs Familie der Funktionen, die in Einheiten und nicht in _TCHAR Byte funktionieren. Kopiert z. B. _tcsncpyn_TCHARsnicht n Byte.

Da für einige Funktionen zur Zeichenfolgenbehandlung bei Einzelbyte-Zeichensätzen (SBCS) char*-Parameter (mit Vorzeichen) erforderlich sind, wird bei der Definition von _MBCS eine Compiler-Warnung ausgegeben, die auf einen Typenkonflikt hinweist. Es gibt drei Möglichkeiten, diese Warnung zu vermeiden:

  1. Verwenden Sie die typsichere Inlinefunktion thunks in tchar.h. Dies ist die Standardeinstellung.

  2. Verwenden Sie die direkten Makros in tchar.h, indem Sie in der Befehlszeile definieren _MB_MAP_DIRECT . In diesem Fall müssen Sie die Typübereinstimmung manuell sicherstellen. Dies ist die schnellste Methode; sie ist jedoch nicht typsicher.

  3. Verwenden Sie die typsichere statisch verknüpfte Bibliotheksfunktion thunks in tchar.h. Definieren Sie hierzu in der Befehlszeile die Konstante _NO_INLINING. Dies ist die langsamste Methode; sie bietet jedoch auch die größte Typsicherheit.

Präprozessordirektiven zum Zuordnen von generischem Text

#define Kompilierte Version Beispiel
_UNICODE Unicode (Breitzeichen) _tcsrev ist _wcsrev zugeordnet.
_MBCS Mehrbytezeichen _tcsrev ist _mbsrev zugeordnet.
Keine (bei der Standardeinstellung ist weder _UNICODE noch _MBCS definiert) SBCS (ASCII) _tcsrev ist strrev zugeordnet.

Die generische Textfunktion _tcsrev, die in tchar.h definiert ist, ordnet z. B. zu _mbsrev , wenn Sie in Ihrem Programm definiert _MBCS sind, oder _wcsrev ob Sie definiert sind _UNICODE. Andernfalls wird _tcsrevstrrev zugeordnet. Andere Datentypzuordnungen werden in tchar.h zur Programmierfreundlichkeit bereitgestellt, sind aber _TCHAR am nützlichsten.

Generische Textzuordnungen von Datentypen

Generischer Text
Datentypname
_UNICODE &
_MBCS nicht definiert
_MBCS
Definiert
_UNICODE
Definiert
_TCHAR char char wchar_t
_TINT int unsigned int wint_t
_TSCHAR signed char signed char wchar_t
_TUCHAR unsigned char unsigned char wchar_t
_TXCHAR char unsigned char wchar_t
_T oder _TEXT Ohne Auswirkung (wird vom Präprozessor entfernt) Ohne Auswirkung (wird vom Präprozessor entfernt) L (konvertiert das folgende Zeichen oder die folgende Zeichenfolge in sein Unicode-Gegenstück)

Eine Liste der generischen Textzuordnungen von Routinen, Variablen und anderen Objekten finden Sie unter Generic-Text Mappings in der Laufzeitbibliotheksreferenz.

Hinweis

Verwenden Sie die str-Funktionsreihe nicht mit Unicode-Zeichenfolgen, da diese wahrscheinlich eingebettete NULL-Bytes enthalten. Ebenso sollten Sie die wcs-Funktionsreihe nicht mit Zeichenfolgen vom Typ MBCS (oder SBCS) verwenden.

Aus den folgenden Codefragmenten geht hervor, wie _TCHAR und _tcsrev für die Zuordnung zu den MBCS-, Unicode- und SBCS-Modellen verwendet werden.

_TCHAR *RetVal, *szString;
RetVal = _tcsrev(szString);

Wenn _MBCS definiert wurde, ordnet der Präprozessor diesem Code folgenden Ausschnitt zu:

char *RetVal, *szString;
RetVal = _mbsrev(szString);

Wenn _UNICODE definiert wurde, ordnet der Präprozessor diesem Code folgenden Ausschnitt zu:

wchar_t *RetVal, *szString;
RetVal = _wcsrev(szString);

Wenn weder _MBCS_UNICODE noch definiert wurden, ordnet der Präprozessor das Fragment wie folgt einem ASCII-Code mit einem Byte zu:

char *RetVal, *szString;
RetVal = strrev(szString);

Folglich können Sie eine einzige Quellcodedatei so schreiben, verwalten und kompilieren, dass sie mit Routinen ausgeführt wird, die jeweils speziell auf einen der drei Zeichensätze ausgerichtet sind.

Siehe auch

Text und Zeichenfolgen
Verwenden von TCHAR.H-Datentypen in _MBCS-Code