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:
Pomocí funkce thunks z Tchar.h zajišťující bezpečnost vložených typů .Toto je výchozí chování.
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ý.
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.