Mapowania typ ogólny-tekst w pliku Tchar.h
Aby uprościć transport kodu do użytku międzynarodowego, biblioteka wykonawcza Microsoft dostarcza specyficzne dla Microsoft mapowania generycznego tekstu na wiele typów danych, procedur i innych obiektów.Można użyć tych mapowań, które są zdefiniowane w Tchar.h aby pisać kod generyczny, który może zostać skompilowany dla zestawów znaków jednobajtowych, wielobajtowych lub Unicode w zależności od stałej manifestu, którą można zdefiniować przy użyciu instrukcji #define.Mapowania tekstu generycznego są Microsoft rozszerzeniami, które nie są ANSI zgodne.
Za pomocą Tchar.h, można skompilować z tych samych źródeł aplikacje z jednobajtowym, wielobajtowym zestawem znaków (MBCS) oraz Unicode.Tchar.h definiuje makra (które mają prefiks _tcs), które przy pomocy poprawnych definicji preprocesora mapuje na odpowiednie funkcje str, _mbs, lub wcs.Aby skompilować MBCS, zdefiniuj symbol _MBCS.Aby skompilować Unicode, zdefiniuj symbol _UNICODE.Aby skompilować aplikację jednobajtową, nie definiuj żadnego z nich (ustawienie domyślne).Domyślnie _MBCS jest zdefiniowany dla aplikacji MFC.
Typ danych _TCHAR jest zdefiniowany warunkowo w 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 dwubajtowych danych znakowych Unicode jest odpowiednikiem 16-bitowym dla 8-bitowego char ze znakiem.) Dla zastosowań międzynarodowych należy użyć rodziny funkcji _tcs, które działają na jednostkach _TCHAR a nie na bajtach.Na przykład _tcsncpy kopiuje n _TCHARs, a nie n bajtów.
Ponieważ niektóre funkcje obsługujące ciągi znaków dla Jednobajtowych zestawów znaków (SBCS) pobierają parametry char* (ze znakiem), skutkuje to pojawieniem się ostrzeżenia kompilatora o niezgodności typów, kiedy _MBCS jest zdefiniowany.Istnieją trzy sposoby na uniknięcie tego ostrzeżenia:
Użycie bezpiecznych łączników funkcji w tekście w Tchar.h.Jest to zachowanie domyślne.
Użycie makra bezpośredniego w Tchar.h poprzez zdefiniowanie _MB_MAP_DIRECT w wierszu polecenia.Jeśli to zrobisz, musisz ręcznie dopasować typy.Jest to najszybsza metoda, ale nie jest bezpieczna.
Użycie bezpiecznych, statycznie dołączonych łączników do funkcji biblioteki w Tchar.h.W tym celu w wierszu polecenia należy zdefiniować stałą _NO_INLINING.Ta metoda jest najwolniejsza ale zarazem najbezpieczniejsza.
Dyrektywy preprocesora dla mapowań tekstów generycznych
# define |
Wersja skompilowana |
Przykład |
---|---|---|
_UNICODE |
Unicode (znak dwubajtowy) |
_tcsrev mapuje na _wcsrev |
_MBCS |
Znak wielobajtowy |
_tcsrev mapuje na _mbsrev |
Brak (domyślnie nie zdefiniowano _UNICODE ani _MBCS) |
SBCS (ASCII) |
_tcsrev mapuje na strrev |
Na przykład funkcja tekstu generycznego _tcsrev, która jest zdefiniowana w Tchar.h, mapuje na _mbsrev jeśli w programie zdefiniowano _MBCS lub na _wcsrev jeśli zdefiniowano _UNICODE.W przeciwnym razie _tcsrev mapuje do strrev.Inne mapowania typów danych są dostarczane przez Tchar.h w celu ułatwienia programowania, ale _TCHAR jest najbardziej przydatny.
Mapowania typów danych tekstów generycznych
Tekst generyczny Nazwa typu danych |
_UNICODE & _MBCS Nie zdefiniowane |
_MBCS Zdefiniowano |
_UNICODE Zdefiniowano |
---|---|---|---|
_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 (usuwane przez preprocesor) |
Brak efektu (usuwane przez preprocesor) |
L (konwertuje następujący znak lub ciąg na jego odpowiednik Unicode) |
Aby uzyskać listę mapowań tekstów generycznych procedur, zmiennych i innych obiektów, zobacz Mapowania zwykłego tekstu w Odwołaniach dla Biblioteki wykonawczej.
[!UWAGA]
Nie należy używać rodziny funkcji str z ciągami znaków Unicode, które mogą zawierać osadzony bajty zerowe.Podobnie, nie należy używać rodziny funkcji wcs z ciągami znaków MBCS (lub SBCS).
Następujące fragmenty kodu ilustrują _TCHAR i _tcsrev dla mapowania na modele MBCS, Unicode i SBCS.
_TCHAR *RetVal, *szString;
RetVal = _tcsrev(szString);
Jeśli zdefiniowano _MBCS, preprocesor mapuje ten fragment ten kod:
char *RetVal, *szString;
RetVal = _mbsrev(szString);
Jeśli zdefiniowano _UNICODE, preprocesor mapuje ten fragment ten kod:
wchar_t *RetVal, *szString;
RetVal = _wcsrev(szString);
Jeśli nie zdefiniowano _MBCS ani _UNICODE, preprocesora mapuje fragment na jednobajtowy kod ASCII 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 źródłowy z kodem do uruchomienia z procedur, które są specyficzne dla dowolnego z trzech rodzajów zestawów znaków.