Zuordnungen für generischen Text in tchar.h

Um die Codeübertragung für internationale Anwendungen zu vereinfachen, stellt die Microsoft-Laufzeitbibliothek Microsoft-spezifische Zuordnungen für generischen Text für viele Datentypen, Routinen und andere Objekte zur Verfügung. Mit diesen Zuordnungen, die in tchar.h definiert sind, können Sie generischen Code schreiben, der für Einzelbyte-, Mehrbyte- oder -Zeichensätze kompiliert werden kann, abhängig von einer eindeutigen Konstante, die Sie mithilfe einer #define-Anweisung definieren. Generische Textzuordnungen sind Microsoft-Erweiterungen, die nicht mit ANSI kompatibel sind.

Mit tchar.h können Sie Einzelbyte-, MBCS- (Mehrbyte-Zeichensätze) und Unicode-Anwendungen aus denselben Quellen erstellen. Mit rchar.h werden Makros (mit dem Präfix _tcs) definiert, die der Funktion str, _mbs oder wcs zugeordnet werden, vorausgesetzt, die Präprozessordefinitionen sind richtig. Definieren Sie zur Erstellung von MBCS das _MBCS-Symbol. Definieren Sie zur Erstellung von Unicode das _UNICODE-Symbol. Um eine Einzelbyte-Anwendung zu erstellen, geben Sie nichts an (Standardeinstellung). Standardmäßig wird _UNICODE für MFC-Anwendungen definiert.

Der _TCHAR-Datentyp wird in tchar.h bedingt definiert. Wenn das _UNICODE-Symbol für den jeweiligen Build definiert ist, wird _TCHAR als wchar_t definiert. Andernfalls (für Einzelbyte- und MBCS-Builds) wird er als char definiert. (wchar_t, der Unicode-Basisdatentyp für Breitzeichen, ist das 16-Bit-Gegenstück zum 8-Bit-Datentyp signed char.) Verwenden Sie für internationale Anwendungen die _tcs-Funktionsreihe, bei der anstelle von Bytes _TCHAR-Einheiten verwendet werden. Beispiel: _tcsncpy kopiert n _TCHARs, nicht n Bytes.

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 typsicheren Inlinefunktionsthunks in tchar.h. Dies ist die Standardeinstellung.

  2. Verwenden Sie die direkten Makros in tchar.h, indem Sie in der Befehlszeile _MB_MAP_DIRECT definieren. 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 typsicheren statisch verknüpften Bibliotheksfunktionsthunks 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 in tchar.h definierte generische Textfunktion _tcsrev wird z. B. der _mbsrev-Funktion zugeordnet, wenn Sie _MBCS in einem Programm definiert haben, oder sie wird _wcsrev zugeordnet, wenn Sie _UNICODE definiert haben. Andernfalls wird _tcsrevstrrev zugeordnet. Zur Vereinfachung der Programmierung werden in tchar.h weitere Datentypzuordnungen zur Verfügung gestellt; _TCHAR ist jedoch die hilfreichste Zuordnung.

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 nächste Zeichen oder die nächste Zeichenfolge in die Unicode-Entsprechung)

Eine Liste mit generischen Textzuordnungen von Routinen, Variablen und anderen Objekten finden Sie unter Generische Textzuordnungen 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 noch _UNICODE definiert wurde, ordnet der Präprozessor dem Einzelbyte-ASCII-Code das Fragment wie folgt 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.

Weitere Informationen

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