Mapowania typu ogólny-tekst w pliku tchar.h

Aby uprościć transport kodu do użytku międzynarodowego, biblioteka czasu wykonywania firmy Microsoft udostępnia specyficzne dla firmy Microsoft mapowania tekstu ogólnego dla wielu typów danych, procedur i innych obiektów. Za pomocą tych mapowań zdefiniowanych w pliku tchar.h można napisać kod ogólny, który można skompilować dla zestawów znaków jednobajtowych, wielobajtowych lub Unicode, w zależności od stałej manifestu zdefiniowanej #define za pomocą instrukcji . Mapowania tekstu ogólnego to rozszerzenia firmy Microsoft, które nie są zgodne ze standardem ANSI.

Za pomocą pliku tchar.h można tworzyć aplikacje jednobajtowe, wielobajtowe zestawy znaków (MBCS) i Unicode z tych samych źródeł. tchar.h definiuje makra (które mają prefiks _tcs), które odpowiednio mapuje definicje preprocesora na str, _mbslub wcs . Aby skompilować MBCS, zdefiniuj symbol _MBCS. Aby skompilować kod Unicode, zdefiniuj symbol _UNICODE. Aby utworzyć aplikację jedno bajtową, zdefiniuj żadną z nich (wartość domyślna). Domyślnie _UNICODE jest definiowany dla aplikacji MFC.

Typ _TCHAR danych jest definiowany warunkowo w pliku tchar.h. Jeśli symbol _UNICODE jest zdefiniowany dla kompilacji, _TCHAR jest zdefiniowany jako wchar_t; w przeciwnym razie dla kompilacji jednobajtowych i MBCS jest zdefiniowany jako char. (wchar_tpodstawowy typ danych o szerokim znaku Unicode jest 16-bitowym odpowiednikiem 8-bitowym signed char). W przypadku aplikacji międzynarodowych należy używać _tcs rodziny funkcji, które działają w _TCHAR jednostkach, a nie bajtach. Na przykład _tcsncpy kopiuje , a nie n bajtyn_TCHARs.

Ponieważ niektóre funkcje obsługi ciągów zestawu znaków jednobajtowych (SBCS) przyjmują (podpisane) char* parametry, wyniki ostrzeżenia kompilatora niezgodności typów podczas _MBCS definiowania. Istnieją trzy sposoby uniknięcia tego ostrzeżenia:

  1. Użyj funkcji wbudowanej z bezpiecznym typem w tchar.h. To jest zachowanie domyślne.

  2. Użyj makr bezpośrednich w pliku tchar.h, definiując _MB_MAP_DIRECT je w wierszu polecenia. Jeśli to zrobisz, musisz ręcznie dopasować typy. Jest to najszybsza metoda, ale nie jest bezpieczna.

  3. Użyj funkcji biblioteki połączonej statycznie bezpiecznie statycznie w tchar.h. W tym celu zdefiniuj stałą _NO_INLINING w wierszu polecenia. Jest to najwolniejsza metoda, ale najbezpieczniejsza.

Dyrektywy preprocesora dla mapowań tekstu ogólnego

# define Skompilowana wersja Przykład
_UNICODE Unicode (znak szeroki) _tcsrev mapuje na _wcsrev
_MBCS Znak wielobajtowy _tcsrev mapuje na _mbsrev
Brak (wartość domyślna nie _UNICODE ma ani _MBCS nie zdefiniowano) SBCS (ASCII) _tcsrev mapuje na strrev

Na przykład funkcja _tcsrevgeneric-text , która jest zdefiniowana w pliku tchar.h, mapuje wartość na _mbsrev wartość zdefiniowaną w programie lub na _wcsrev wartość , jeśli zdefiniowano _MBCS_UNICODEelement . _tcsrev W przeciwnym razie mapuje wartość na strrev. Inne mapowania typów danych są dostępne w pliku tchar.h dla wygody programowania, ale _TCHAR jest najbardziej przydatne.

Mapowania typów danych tekstu ogólnego

Tekst ogólny
Nazwa typu danych
_UNICODE i
nie zdefiniowano _MBCS
_MBCS
Zdefiniowane
_UNICODE
Zdefiniowane
_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 lub _TEXT Brak efektu (usunięte przez preprocesor) Brak efektu (usunięte przez preprocesor) L (konwertuje następujący znak lub ciąg na jego odpowiednik Unicode)

Aby uzyskać listę ogólnych mapowań tekstu procedur, zmiennych i innych obiektów, zobacz Ogólne mapowania tekstu w dokumentacji biblioteki czasu wykonywania.

Uwaga

Nie używaj str rodziny funkcji z ciągami Unicode, które mogą zawierać osadzone bajty o wartości null. Podobnie nie używaj wcs rodziny funkcji z ciągami MBCS (lub SBCS).

Poniższe fragmenty kodu ilustrują użycie elementów _TCHAR i _tcsrev do mapowania na modele MBCS, Unicode i SBCS.

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

Jeśli _MBCS został zdefiniowany, preprocesor mapuje ten fragment na ten kod:

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

Jeśli _UNICODE został zdefiniowany, preprocesor mapuje ten fragment na ten kod:

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

Jeśli ani _MBCS_UNICODE nie zdefiniowano, preprocesor mapuje fragment na kod ASCII pojedynczego bajtu w następujący sposób:

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

W związku z tym można pisać, obsługiwać i kompilować pojedynczy plik kodu źródłowego do uruchamiania z procedurami specyficznymi dla dowolnego z trzech rodzajów zestawów znaków.

Zobacz też

Tekst i ciągi
Używanie typów danych TCHAR.H z kodem _MBCS