Sdílet prostřednictvím


Mapování obecného text v Tchar.h

Pro zjednodušení migrace kódu pro mezinárodní použití, Microsoft obsahuje běhovou knihovnu Microsoft konkretně mapující obecný text pro mnoho datových typů, rutin a jiných objektů.Pomocí těchto mapování, které jsou definovány v Tchar.h, můžete napsat obecný kód, který může být sestaven pro jeden bajt, více bajtů nebo znakovou sadu Unicode v závislosti na konstantě manifestu, která je definována pomocí příkazu #define.Mapování obecných textů jsou rozšíření Microsoft, která nejsou kompatibilní s ANSI.

Pomocí Tchar.h, můžete vytvořit jedno-bajtovou, více-bajtovou znakovou sadu (MBCS) a Unicode aplikace ze stejných zdrojů.Tchar.h definuje makra (mající předponu _tcs), která se správnými definicemi preprocesoru, se mapují na funkce str, _mbsNebo wcs podle potřeby.Chcete-li sestavit znakovou sadu MBCS, definujte symbol _MBCS.Chcete-li sestavit Unicode, definujte symbol _UNICODE.K vytvoření jedno-bajtové aplikace, nedefinujte žádné (výchozí nastavení).Ve výchozím nastavení pro MFC aplikace je definováno _MBCS.

Datový typ _TCHAR je definován v Tchar.h.Pokud je symbol _UNICODE definován pro vaše sestavení a _TCHAR je definována jako wchar_t; v opačném případě jedno-bajtová a MBCS sestavení, je definována jako char.(wchar_t, je základní typ dat celého znaku Unicode 16bitový protějšek na 8-bit podepsané char.) Pro mezinárodní aplikace, použijte řadů funkcí _tcs, které pracují v jednotkách _TCHAR, ne v bajtech.Například _tcsncpy kopíruje n_TCHARs, ne bajty n.

Protože některé funkce zpracování řetězců jedno bajtových znakových sad (SBCS) používají (podepsaný) parametr char*, dojde k upozornění o neshodě typů při definování _MBCS.Existují tří způsoby jak se můžete vyhnout těmto upozorněním:

  1. Pomocí funkce thunks z Tchar.h zajišťující bezpečnost vložených typů .Toto je výchozí chování.

  2. Použitím přímého makra v Tchar.h definováním _MB_MAP_DIRECT v příkazové řádce.Pokud tak učiníte, musíte ručně spárovat typy.To je nejrychlejší způsob, ale není typově bezpečný.

  3. Použijte typově bezpečnou funkci thunks v Tchart.h, která je staticky propojená s knihovnou.Definujte konstantu v příkazové řádce _NO_INLINING.Toto je metoda nejpomalejší, ale nejvíce zajišťující bezpečnost typů.

Směrnice preprocesor pro mapování obecných textů

# define

Kompilovaná verze

Příklad

_UNICODE

Unicode (široké znaky)

_tcsrevmapuje_wcsrev

_MBCS

Více-bajtové znaky

_tcsrevmapuje_mbsrev

Žádné (výchozí nastavení nemá definováno ani _UNICODE ani _MBCS)

SBCS(ASCII)

_tcsrevmapujestrrev

Například obecná textová funkce _tcsrev, která je definována v Tchar.h, se mapuje na _mbsrev pokud jste definovali _MBCS v aplikaci nebo k _wcsrev pokud jste definovali _UNICODE.Jinak _tcsrev mapuje na strrev.Další mapovaní datových typů je poskytováno v programovacích konvencích v Tchar.h, ale _TCHAR je zvláště vhodné.

Mapování obecných textových databázový typů

Obecný text

Názvy datových typů

_UNICODE &

_MBCS není definováno

_MBCS

Definice

_UNICODE

Definice

_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

_Tnebo_TEXT

Žádný účinek (odstraněno preprocesorem)

Žádný účinek (odstraněno preprocesorem)

L (převede následující znak nebo řetězec na jeho Unicode protějšek)

Pro seznam mapování obecných textových rutin, proměnných a jiných objektů, viz. Mapování Generic Text v referencích běhové knihovny.

[!POZNÁMKA]

Nepoužívejte řadu funkcí str s řetězci Unicode, které by mohly obsahovat vložené null bajty.Podobně nepoužívejte řadu funkcí wcs s řetězci znakové sady MBCS (nebo SBCS).

Následující fragmenty kódu ilustrují použití _TCHAR a _tcsrev pro mapování znaková sada MBCS, Unicode a modely SBCS.

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

Pokud byla _MBCS definována, preprocesor namapuje tento fragment na tento kód:

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

Pokud byla _UNICODE definována, preprocesor namapuje tento fragment na tento kód:

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

Pokud ani _MBCS ani _UNICODE nebyla definována, preprocesor namapuje fragment na jedno-bajtový ASCII kód takto:

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

Proto můžete psát, udržovat a zkompilovat soubor s jedno-zdrojovým souborem kódu, který spustí rutiny, které jsou specifické pro některé ze tři druhů znakových sad.

Viz také

Koncepty

Text a řetězce v jazyce C++

Použití datových typů TCHAR.H s kódováním _MBCS