Zuordnungen für generischen Text in Tchar.h

Aktualisiert: November 2007

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 Unicode kompiliert werden kann, abhängig von einer eindeutigen Konstante, die Sie mithilfe einer #define-Anweisung definieren. Zuordnungen für generischen Text sind Erweiterungen von Microsoft, die nicht ANSI-kompatibel sind.

Mit Tchar.h können Sie Einzelbyte-, MBCS- und Unicode-Anwendungen aus denselben Quellen erstellen. Mit Tchar.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 _MBCS 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 char mit Vorzeichen.) Verwenden Sie für internationale Anwendungen die _tcs-Funktionreihe, bei der anstelle von Bytes _TCHAR-Einheiten verwendet werden. _tcsncpy z. B. kopiert n**_TCHAR**s, nicht n Bytes.

Da für einige Funktionen zur SBCS-Zeichenfolgenbehandlung char*-Parameter (mit Vorzeichen) erforderlich sind, wird bei der Definition von _MBCS eine Compiler-Warnung ausgegeben, die auf einen Typenkonflikt hinweist. Nachfolgend finden Sie drei Möglichkeiten, mit der die Ausgabe dieser Warnung verhindert werden kann Sie vermeiden diese Warnung, wenn Sie eines der folgenden Verfahren verwenden (nach Effektivität geordnet):

  1. Verwenden Sie die typsicheren Inlinefunktions-Thunks in Tchar.h. Dies ist das Standardverfahren.

  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 Bibliotheksfunktions-Thunks in Tchar.h. Definieren Sie zu diesem Zweck in der Befehlszeile die _NO_INLINING-Konstante. 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 wird _wcsrev zugeordnet

_MBCS

Mehrbytezeichen

_tcsrev wird zugeordnet _mbsrev

Keine (dies ist die Standardeinstellung: weder _UNICODE noch _MBCS ist definiert)

SBCS (ASCII)

_tcsrev wird 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 _tcsrev der Funktion strrev 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

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 Unicode-Entsprechung)

Eine vollständige Liste mit generischen Textzuordnungen von Routinen, Variablen und anderen Objekten finden Sie unter Zuordnungen für generischen Text 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 Codeausschnitten 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 dem Code folgenden Ausschnitt zu:

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

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

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

Wenn weder _MBCS noch _UNICODE noch definiert wurde, ordnet der Präprozessor den Ausschnitt Einzebyte-ASCII-Code 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

Konzepte

Zeichensätze in C++

Verwenden von TCHAR.H-Datentypen in _MBCS-Code