Dela via


Använda TCHAR.H-datatyper med _MBCS Code

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 _tprintf mappar till printf; strängargumenten till printf är av typen char*. Om du använder datatypen _TCHAR generic-text för dina strängtyper, matchar de formella och faktiska parametertyperna eftersom printf mappar till _TCHAR*.

  • En MBCS-specifik rutin. I det här fallet förväntas strängargumenten vara av typen unsigned char*. Till exempel _tcsrev mappar till _mbsrev, som förväntar sig och returnerar en sträng av typen unsigned char*. Om du använder datatypen _TCHAR generic-text för dina strängtyper, finns det en möjlig typkonflikt eftersom _TCHAR mappar till typen char.

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 _tcsrev till _mbsrev genom en thunk i Libc.lib. Detta ändrar typerna av _mbsrev inkommande parametrar och utgående returvärde från _TCHAR* (dvs. char *) till unsigned 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_INLINING
    

    Den 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_DIRECT
    

    Den 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 _mbschr
    

    Nä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 _TXCHAR generic-text. _TXCHAR mappar till typ char i SBCS-kod men mappar till typ unsigned char i MBCS-kod. Mer information om generiska textmakron finns iGeneric-Text Mappningar i Run-Time-biblioteksreferensen.

Se även

Generic-Text mappningar i tchar.h