Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 bajty _TCHARsn.
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:
Użyj funkcji wbudowanej z bezpiecznym typem w tchar.h. To jest zachowanie domyślne.
Użyj makr bezpośrednich w pliku tchar.h, definiując
_MB_MAP_DIRECTje w wierszu polecenia. Jeśli to zrobisz, musisz ręcznie dopasować typy. Jest to najszybsza metoda, ale nie jest bezpieczna.Użyj funkcji biblioteki połączonej statycznie bezpiecznie statycznie w tchar.h. W tym celu zdefiniuj stałą
_NO_INLININGw 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 _MBCS wartość , jeśli zdefiniowano _wcsrev_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.