Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
När manifestkonstanten _MBCS definieras mappar en viss allmän textrutin till någon av följande typer av rutiner:
En SBCS-rutin som hanterar byte, tecken och strängar i flerabyte på lämpligt sätt. I det här fallet förväntas strängargumenten vara av typen
char*. Till exempel_tprintfmappar tillprintf; strängargumenten tillprintfär av typenchar*. Om du använder datatypen_TCHARgeneric-text för dina strängtyper, matchar de formella och faktiska parametertyperna eftersomprintfmappar till_TCHAR*.En MBCS-specifik rutin. I det här fallet förväntas strängargumenten vara av typen
unsigned char*. Till exempel_tcsrevmappar till_mbsrev, som förväntar sig och returnerar en sträng av typenunsigned char*. Om du använder datatypen_TCHARgeneric-text för dina strängtyper, finns det en möjlig typkonflikt eftersom_TCHARmappar till typenchar.
Följande är tre lösningar för att förhindra den här typen av konflikt (och C-kompilatorvarningar eller C++-kompilatorfel som skulle uppstå):
Använd standardbeteendet. tchar.h tillhandahåller generiska textrutinprototyper för rutiner i körningsbiblioteken, som i följande exempel.
char * _tcsrev(char *);I standardfallet mappar prototypen för
_tcsrevtill_mbsrevgenom en thunk i Libc.lib. Detta ändrar typerna av_mbsrevinkommande parametrar och utgående returvärde från_TCHAR*(dvs.char *) tillunsigned char *. Den här metoden säkerställer typmatchning när du använder_TCHAR, men den är relativt långsam på grund av funktionsanropets omkostnader.Använd funktionsinlining genom att införliva följande preprocessor-instruktion i koden.
#define _USE_INLININGDen här metoden gör att en infogad funktion thunk, som tillhandahålls i tchar.h, mappar den generiska textrutinen direkt till lämplig MBCS-rutin. Följande kodutdrag från tchar.h ger ett exempel på hur detta görs.
__inline char *_tcsrev(char *_s1) {return (char *)_mbsrev((unsigned char *)_s1);}Om du kan använda inlining är detta den bästa lösningen eftersom den garanterar typmatchning och inte har någon extra tidskostnad.
Använd direktmappning genom att införliva följande preprocessor-instruktion i koden.
#define _MB_MAP_DIRECTDen här metoden är ett snabbt alternativ om du inte vill använda standardbeteendet eller inte kan använda inlining. Det gör att rutinen generic-text mappas av ett makro direkt till MBCS-versionen av rutinen, som i följande exempel från tchar.h.
#define _tcschr _mbschrNär du använder den här metoden måste du vara noga med att se till att lämpliga datatyper används för strängargument och strängreturvärden. Du kan använda typkonvertering för att säkerställa korrekt typmatchning eller så kan du använda datatypen
_TXCHARgeneric-text._TXCHARmappar till typchari SBCS-kod men mappar till typunsigned chari MBCS-kod. Mer information om generiska textmakron finns iGeneric-Text Mappningar i Run-Time-biblioteksreferensen.