Sdílet prostřednictvím


Mapování obecného textu v souboru tchar.h

Pro zjednodušení přenosu kódu pro mezinárodní použití poskytuje knihovna Microsoft run-time mapování obecného textu specifické pro Microsoft pro mnoho datových typů, rutin a dalších objektů. Pomocí těchto mapování, která jsou definována v tchar.h, můžete napsat obecný kód, který lze zkompilovat pro jednobajtové, vícebajtové nebo Unicode znakové sady v závislosti na konstantě manifestu, kterou definujete pomocí #define příkazu. Mapování obecného textu jsou rozšíření Microsoftu, která nejsou kompatibilní s ANSI.

Pomocí tchar.h můžete vytvářet jednobajtové, vícebajtové znakové sady (MBCS) a aplikace Unicode ze stejných zdrojů. tchar.h definuje makra (která mají předponu _tcs), která podle potřeby se správnými definicemi preprocesoru mapují na str, _mbsnebo wcs funkce. Chcete-li vytvořit MBCS, definujte symbol _MBCS. Chcete-li sestavit Unicode, definujte symbol _UNICODE. Pokud chcete vytvořit jednobajtů aplikace, definujte ani jednu (výchozí). Ve výchozím nastavení _UNICODE je definován pro aplikace MFC.

Datový _TCHAR typ je definován podmíněně v tchar.h. Pokud je symbol _UNICODE definovaný pro sestavení, _TCHAR je definován jako wchar_t; v opačném případě pro sestavení s jedním bajtem a MBCS, je definován jako char. (wchar_tzákladní datový typ Unicode pro široké znaky, je 16bitový protějšek 8bitového signed charznaku .) V případě mezinárodních aplikací používejte _tcs řadu funkcí, které pracují v _TCHAR jednotkách, nikoli bajtech. Například _tcsncpy kopie n _TCHARs, nikoli n bajty.

Vzhledem k tomu, že některé funkce zpracování řetězců s jednou bajtovou sadou (SBCS) přebírají (podepsané) char* parametry, zobrazí se _MBCS při definování výsledky upozornění kompilátoru neshod typů. Existují tři způsoby, jak se vyhnout tomuto upozornění:

  1. Použijte typově bezpečné vložené funkce thunks in tchar.h. Toto je výchozí chování.

  2. Přímé makra v tchar.h použijte definováním _MB_MAP_DIRECT na příkazovém řádku. Pokud to uděláte, musíte ručně shodovat typy. Jedná se o nejrychlejší metodu, ale není typově bezpečná.

  3. Použijte staticky propojenou funkci knihovny s bezpečným typem v tchar.h. Uděláte to tak, že na příkazovém řádku definujete konstantu _NO_INLINING . Jedná se o nejpomalejší metodu, ale nejbezpečnější typ.

Direktivy preprocesoru pro mapování obecného textu

# define Kompilovaná verze Příklad
_UNICODE Unicode (široký znak) _tcsrev mapuje na _wcsrev
_MBCS Vícebajtový znak _tcsrev mapuje na _mbsrev
Žádné (výchozí hodnota není definována ani _MBCS není definována_UNICODE) SBCS (ASCII) _tcsrev mapuje na strrev

Například obecná textová funkce _tcsrev, která je definována v tchar.h, mapuje _mbsrev , pokud jste definovali _MBCS v programu, nebo _wcsrev pokud jste definovali _UNICODE. V opačném případě se _tcsrev mapuje na strrev. Další mapování datových typů jsou k dispozici v tchar.h pro usnadnění programování, ale _TCHAR je nejužitečnější.

Mapování datových typů generic-text

Obecný text
Název datového typu
_UNICODE &
_MBCS není definován
_MBCS
Definované
_UNICODE
Definované
_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 nebo _TEXT Žádný efekt (odebraný preprocesorem) Žádný efekt (odebraný preprocesorem) L (převede následující znak nebo řetězec na jeho protějšek Unicode)

Seznam mapování obecných textů rutin, proměnných a dalších objektů naleznete v tématu Mapování obecného textu v referenční dokumentaci knihovny za běhu.

Poznámka:

Nepoužívejte str řadu funkcí s řetězci Unicode, které pravděpodobně obsahují vložené bajty null. Podobně nepoužívejte wcs řadu funkcí s řetězci MBCS (nebo SBCS).

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

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

Pokud _MBCS je definovaný, preprocesor mapuje tento fragment na tento kód:

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

Pokud _UNICODE je definovaný, preprocesor mapuje tento fragment na tento kód:

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

_MBCS Pokud ani _UNICODE nebyl definován, preprocesor mapuje fragment na kód ASCII s jedním bajtem následujícím způsobem:

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

Proto můžete zapsat, udržovat a zkompilovat soubor s jedním zdrojovým kódem pro spuštění s rutinami, které jsou specifické pro kterýkoli ze tří druhů znakových sad.

Viz také

Text a řetězce
Použití datových typů TCHAR.H s kódováním _MBCS