Menggunakan TCHAR. Jenis Data H dengan Kode _MBCS
Ketika konstanta manifes _MBCS
ditentukan, teks generik tertentu memetakan rutinitas ke salah satu jenis rutinitas berikut:
Rutinitas SBCS yang menangani byte, karakter, dan string multibyte dengan tepat. Dalam hal ini, argumen string diharapkan berjenis
char*
. Misalnya,_tprintf
peta keprintf
; argumen string keprintf
berjenischar*
. Jika Anda menggunakan_TCHAR
jenis data teks generik untuk jenis string Anda, jenis parameter formal dan aktual untukprintf
kecocokan karena_TCHAR*
peta kechar*
.Rutinitas khusus MBCS. Dalam hal ini, argumen string diharapkan berjenis
unsigned char*
. Misalnya,_tcsrev
peta ke_mbsrev
, yang mengharapkan dan mengembalikan string jenisunsigned char*
. Jika Anda menggunakan_TCHAR
jenis data teks generik untuk jenis string Anda, ada potensi konflik jenis karena_TCHAR
peta untuk mengetikchar
.
Berikut adalah tiga solusi untuk mencegah konflik jenis ini (dan peringatan pengkompilasi C atau kesalahan kompilator C++ yang akan mengakibatkan):
Gunakan perilaku default. tchar.h menyediakan prototipe rutin teks generik untuk rutinitas di pustaka run-time, seperti dalam contoh berikut.
char * _tcsrev(char *);
Dalam kasus default, prototipe untuk
_tcsrev
peta melalui_mbsrev
thunk di Libc.lib. Ini mengubah jenis_mbsrev
parameter masuk dan nilai pengembalian keluar dari_TCHAR*
(yaitu,char *
) menjadiunsigned char *
. Metode ini memastikan pencocokan jenis saat Anda menggunakan_TCHAR
, tetapi relatif lambat karena overhead panggilan fungsi.Gunakan fungsi inlining dengan menggabungkan pernyataan praprosesor berikut dalam kode Anda.
#define _USE_INLINING
Metode ini menyebabkan thunk fungsi sebaris, disediakan dalam tchar.h, untuk memetakan rutinitas teks generik langsung ke rutinitas MBCS yang sesuai. Kutipan kode berikut dari tchar.h memberikan contoh bagaimana hal ini dilakukan.
__inline char *_tcsrev(char *_s1) {return (char *)_mbsrev((unsigned char *)_s1);}
Jika Anda dapat menggunakan inlining, ini adalah solusi terbaik, karena menjamin pencocokan jenis dan tidak memiliki biaya waktu tambahan.
Gunakan pemetaan langsung dengan menggabungkan pernyataan praprosesor berikut dalam kode Anda.
#define _MB_MAP_DIRECT
Pendekatan ini memberikan alternatif cepat jika Anda tidak ingin menggunakan perilaku default atau tidak dapat menggunakan inlining. Ini menyebabkan rutinitas teks generik dipetakan oleh makro langsung ke versi MBCS dari rutinitas, seperti dalam contoh berikut dari tchar.h.
#define _tcschr _mbschr
Saat Anda mengambil pendekatan ini, Anda harus berhati-hati untuk memastikan penggunaan jenis data yang sesuai untuk argumen string dan nilai pengembalian string. Anda dapat menggunakan pengecoran jenis untuk memastikan pencocokan jenis yang tepat atau Anda dapat menggunakan
_TXCHAR
jenis data teks generik._TXCHAR
memetakan untuk mengetikchar
kode SBCS tetapi memetakan untuk mengetikunsigned char
kode MBCS. Untuk informasi selengkapnya tentang makro teks generik, lihat Pemetaan Teks Generik di Referensi Pustaka Run-Time.