Używanie typów danych TCHAR.H z kodem _MBCS
Gdy stała _MBCS
manifestu jest zdefiniowana, dana rutyna tekstu ogólnego mapuje na jeden z następujących rodzajów procedur:
Rutyna SBCS, która odpowiednio obsługuje bajty, znaki i ciągi wielobajtowe. W takim przypadku argumenty ciągu powinny mieć typ
char*
. Na przykład_tprintf
mapuje naprintf
; argumenty ciągu doprintf
mają typchar*
. Jeśli używasz_TCHAR
typu danych ogólnego tekstu dla typów ciągów, typy parametrów formalnych i rzeczywistych dlaprintf
dopasowania, ponieważ_TCHAR*
mapuje nachar*
wartość .Rutyna specyficzna dla MBCS. W takim przypadku argumenty ciągu powinny mieć typ
unsigned char*
. Na przykład_tcsrev
mapuje wartość ,_mbsrev
która oczekuje i zwraca ciąg typuunsigned char*
. Jeśli używasz_TCHAR
typu danych ogólnego tekstu dla typów ciągów, istnieje potencjalny konflikt typu, ponieważ_TCHAR
mapuje na typchar
.
Poniżej przedstawiono trzy rozwiązania uniemożliwiające konflikt tego typu (oraz ostrzeżenia kompilatora języka C lub błędy kompilatora C++, które mogłyby spowodować):
Użyj domyślnego zachowania. tchar.h udostępnia prototypy procedur ogólnych tekstu dla procedur w bibliotekach czasu wykonywania, jak w poniższym przykładzie.
char * _tcsrev(char *);
W domyślnym przypadku prototyp
_tcsrev
mapowania przez_mbsrev
thunk w Libc.lib. Spowoduje to zmianę_mbsrev
typów parametrów przychodzących i wychodzącej wartości zwracanej z_TCHAR*
(czylichar *
) naunsigned char *
. Ta metoda zapewnia dopasowanie typu w przypadku używania_TCHAR
metody , ale jest stosunkowo niska z powodu obciążenia wywołania funkcji.Użyj wznawiania funkcji, dołączając następującą instrukcję preprocesora w kodzie.
#define _USE_INLINING
Ta metoda powoduje, że funkcja śródliniowa thunk, podana w tchar.h, mapuje procedurę ogólnego tekstu bezpośrednio na odpowiednią procedurę MBCS. Poniższy fragment kodu z pliku tchar.h zawiera przykład tego, jak to zrobić.
__inline char *_tcsrev(char *_s1) {return (char *)_mbsrev((unsigned char *)_s1);}
Jeśli możesz użyć inliningu, jest to najlepsze rozwiązanie, ponieważ gwarantuje dopasowanie typu i nie ma dodatkowych kosztów czasowych.
Użyj bezpośredniego mapowania, dołączając następującą instrukcję preprocesora w kodzie.
#define _MB_MAP_DIRECT
Takie podejście zapewnia szybką alternatywę, jeśli nie chcesz używać domyślnego zachowania lub nie można użyć wpinania. Powoduje to mapowanie procedury ogólnego tekstu przez makro bezpośrednio do wersji MBCS procedury, jak w poniższym przykładzie z tchar.h.
#define _tcschr _mbschr
W przypadku stosowania tego podejścia należy zachować ostrożność, aby zapewnić użycie odpowiednich typów danych dla argumentów ciągów i zwracanych wartości ciągu. Możesz użyć rzutowania typów, aby zapewnić odpowiednie dopasowanie typu lub użyć
_TXCHAR
typu danych tekstowych ogólnych._TXCHAR
mapuje na typchar
kodu SBCS, ale mapuje na typunsigned char
w kodzie MBCS. Aby uzyskać więcej informacji na temat makr ogólnych tekstu, zobacz Ogólne mapowania tekstu w dokumentacji biblioteki czasu wykonywania.