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
, _mbs
nebo 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_t
základní datový typ Unicode pro široké znaky, je 16bitový protějšek 8bitového signed char
znaku .) 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í:
Použijte typově bezpečné vložené funkce thunks in tchar.h. Toto je výchozí chování.
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á.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