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
, _mbs
lub 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_t
podstawowy 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 n
_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:
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_DIRECT
je 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_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 _tcsrev
generic-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
_UNICODE
element . _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.