Udostępnij za pośrednictwem


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:

  1. Użycie bezpiecznych łączników funkcji w tekście w Tchar.h.Jest to zachowanie domyślne.

  2. 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.

  3. 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.

Zobacz też

Koncepcje

Tekst i ciągi w programie Visual C++

Używanie typów danych TCHAR.H z kodem _MBCS