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 Unicode-Zeichensätze kompiliert werden kann, abhängig von einer eindeutigen Konstante, die Sie mithilfe einer #define-Anweisung definieren. Zuordnungen für generischen Text sind Microsoft-Erweiterungen, die nicht ANSI-kompatibel sind.
Mit Tchar.h können Sie Einzelbyte-, MBCS- (Mehrbyte-Zeichensätze) 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-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:
Verwenden Sie die typsicheren Inlinefunktionsthunks in Tchar.h. Dies ist das Standardverhalten.
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.
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 wird _wcsrev zugeordnet. |
_MBCS |
Mehrbytezeichen |
_tcsrev wird _mbsrev zugeordnet. |
Keine (bei der Standardeinstellung ist weder _UNICODE noch _MBCS 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 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 |
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 -Entsprechung) |
Eine Liste mit generischen Textzuordnungen von Routinen, Variablen und anderen Objekten finden Sie unter Generic-Text Mappings in der Laufzeitbibliotheksreferenz.
Tipp
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 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 den Ausschnitt 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.