Bagikan melalui


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 ke printf; argumen string ke printf berjenis char*. Jika Anda menggunakan _TCHAR jenis data teks generik untuk jenis string Anda, jenis parameter formal dan aktual untuk printf kecocokan karena _TCHAR* peta ke char*.

  • Rutinitas khusus MBCS. Dalam hal ini, argumen string diharapkan berjenis unsigned char*. Misalnya, _tcsrev peta ke _mbsrev, yang mengharapkan dan mengembalikan string jenis unsigned char*. Jika Anda menggunakan _TCHAR jenis data teks generik untuk jenis string Anda, ada potensi konflik jenis karena _TCHAR peta untuk mengetik char.

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 *) menjadi unsigned 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 mengetik char kode SBCS tetapi memetakan untuk mengetik unsigned char kode MBCS. Untuk informasi selengkapnya tentang makro teks generik, lihat Pemetaan Teks Generik di Referensi Pustaka Run-Time.

Lihat juga

Pemetaan Teks Generik di tchar.h