Dela via


Generic-Text mappningar i tchar.h

För att förenkla transporten av kod för internationell användning tillhandahåller Microsofts run-time-bibliotek Microsoft-specifika generiska textmappningar för många datatyper, rutiner och andra objekt. Du kan använda dessa mappningar, som definieras i tchar.h, för att skriva allmän kod som kan kompileras för enstaka byte, flerabyte eller Unicode-teckenuppsättningar, beroende på en manifestkonstant som du definierar med hjälp av en #define instruktion. Mappningar med allmän text är Microsoft-tillägg som inte är ANSI-kompatibla.

Med hjälp av tchar.h kan du skapa MBCS-program (Single Byte, Multibyte Character Set) och Unicode från samma källor. tchar.h definierar makron (som har prefixet _tcs) som, med rätt preprocessordefinitioner, mappar till str, _mbseller wcs funktioner efter behov. Om du vill skapa MBCS definierar du symbolen _MBCS. Om du vill skapa Unicode definierar du symbolen _UNICODE. Om du vill skapa ett program med en enda byte definierar du inget av dem (standard). Som standard _UNICODE definieras för MFC-program.

Datatypen _TCHAR definieras villkorligt i tchar.h. Om symbolen _UNICODE har definierats för din version definieras _TCHAR som wchar_t; annars, för enbyte- och MBCS-versioner, definieras den som char. (wchar_t den grundläggande Unicode-datatypen med breda tecken är motsvarigheten till en 8-bitars signed char.) För internationella program använder du familjen av funktioner _tcs, som arbetar i _TCHAR-enheter, inte byte. Till exempel _tcsncpy kopierar n_TCHARs, inte n byte.

Eftersom vissa stränghanteringsfunktioner för Single Byte Character Set (SBCS) tar (signerade) char* parametrar, uppstår en kompilatorvarning för typmismatch när _MBCS är definierad. Det finns tre sätt att undvika den här varningen:

  1. Använd typsäkra inline-thunks i tchar.h. Det här är standardbeteendet.

  2. Använd de direkta makrona i tchar.h genom att _MB_MAP_DIRECT definiera på kommandoraden. Om du gör detta måste du matcha typer manuellt. Det här är den snabbaste metoden, men är inte typsäker.

  3. Använd den statiskt länkade biblioteksfunktionen type-safe thunks i tchar.h. Det gör du genom att definiera konstanten _NO_INLINING på kommandoraden. Det här är den långsammaste metoden, men den mest typsäkra.

Förprocessordirektiv för Generic-Text mappningar

# definiera Kompilerad version Exempel
_UNICODE Unicode (brett tecken) _tcsrev mappar till _wcsrev
_MBCS Flerbytestecken _tcsrev mappar till _mbsrev
Inget (standardinställningen har varken _UNICODE eller _MBCS definierats) SBCS (ASCII) _tcsrev mappar till strrev

Till exempel den generiska textfunktionen _tcsrev, som definieras i tchar.h, mappar till _mbsrev om du har definierat _MBCS i ditt program eller till _wcsrev om du har definierat _UNICODE. Annars _tcsrev mappas till strrev. Andra datatypsmappningar tillhandahålls i tchar.h för att underlätta programmeringen, men _TCHAR är det mest användbara.

Generic-Text datatypsmappningar

Generic-Text
Namn på datatyp
_UNICODE &
_MBCS inte definierad
_MBCS
Definierad
_UNICODE
Definierad
_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 eller _TEXT Ingen effekt (tas bort av förprocessorn) Ingen effekt (tas bort av förprocessorn) L (konverterar följande tecken eller sträng till dess Unicode-motsvarighet)

En lista över allmän textmappningar av rutiner, variabler och andra objekt finns iGeneric-Text Mappningar i Run-Time-biblioteksreferensen.

Anmärkning

Använd inte serien str med funktioner med Unicode-strängar, som sannolikt kommer att innehålla inbäddade null-byte. På samma sätt ska du inte använda wcs serien med funktioner med MBCS-strängar (eller SBCS).

Följande kodfragment illustrerar användningen av _TCHAR och _tcsrev för mappning till MBCS-, Unicode- och SBCS-modellerna.

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

Om _MBCS har definierats mappar förprocessorn det här fragmentet till den här koden:

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

Om _UNICODE har definierats mappar förprocessorn det här fragmentet till den här koden:

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

Om varken _MBCS eller _UNICODE har definierats mappar förprocessorn fragmentet till ASCII-kod med en enda bytes, enligt följande:

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

Därför kan du skriva, underhålla och kompilera en kodfil med en enda källkod som ska köras med rutiner som är specifika för någon av de tre typerna av teckenuppsättningar.

Se även

Text och strängar
Använda TCHAR H-datatyper med _MBCS-kod