Aracılığıyla paylaş


_MBCS Kodu ile TCHAR.H Veri Türlerini Kullanma

Bildirim sabiti _MBCS tanımlandığında, belirli bir genel metin yordamı aşağıdaki yordam türlerinden biriyle eşler:

  • Çok baytlı baytları, karakterleri ve dizeleri uygun şekilde işleyen bir SBCS yordamı. Bu durumda dize bağımsız değişkenlerinin türünde char*olması beklenir. Örneğin, _tprintf ile printfeşlenir; dize bağımsız değişkenleri printf türündedir char*. Dize türleriniz için genel metin veri türünü kullanırsanız _TCHAR , için resmi ve gerçek parametre türleri printf eşleştirildi çünkü _TCHAR* ile eşleşiyor char*.

  • MBCS'ye özgü bir yordam. Bu durumda dize bağımsız değişkenlerinin türünde unsigned char*olması beklenir. Örneğin, _tcsrev türünde _mbsrevbir dize bekleyen ve döndüren ile eşlerunsigned char*. Dize türleriniz için genel metin veri türünü kullanırsanız _TCHAR , türüyle eşlendiğinden _TCHARcharolası bir tür çakışması vardır.

Bu tür çakışmasını önlemeye yönelik üç çözüm (ve C derleyici uyarıları veya C++ derleyici hataları ortaya çıkar):

  • Varsayılan davranışı kullanın. tchar.h, aşağıdaki örnekte olduğu gibi çalışma zamanı kitaplıklarındaki yordamlar için genel metin yordamı prototipleri sağlar.

    char * _tcsrev(char *);
    

    Varsayılan durumda, Libc.lib'deki bir thunk üzerinden harita _tcsrev prototipi_mbsrev. Bu, gelen parametrelerin _mbsrev türlerini ve giden dönüş değerini _TCHAR* (diğer bir ifadeyle char *) olarak unsigned char *değiştirir. Bu yöntem, kullanırken _TCHARtür eşleştirmeyi sağlar, ancak işlev çağrısı ek yükü nedeniyle nispeten yavaştır.

  • Kodunuzda aşağıdaki önişlemci deyimini ekleyerek işlev inlining işlevini kullanın.

    #define _USE_INLINING
    

    Bu yöntem, tchar.h dosyasında sağlanan satır içi işlev thunk işlevinin genel metin yordamını doğrudan uygun MBCS yordamıyla eşlemesine neden olur. Aşağıdaki tchar.h kod alıntısı, bunun nasıl yapıldığını gösteren bir örnek sağlar.

    __inline char *_tcsrev(char *_s1)
    {return (char *)_mbsrev((unsigned char *)_s1);}
    

    Satır içi eklemeyi kullanabilirseniz, bu en iyi çözümdür çünkü tür eşleştirmeyi garanti eder ve ek zaman maliyeti yoktur.

  • Kodunuzda aşağıdaki önişlemci deyimini ekleyerek doğrudan eşlemeyi kullanın.

    #define _MB_MAP_DIRECT
    

    Varsayılan davranışı kullanmak istemiyorsanız veya inlining kullanamıyorsanız, bu yaklaşım hızlı bir alternatif sağlar. Tchar.h dosyasındaki aşağıdaki örnekte olduğu gibi, genel metin yordamının bir makro tarafından doğrudan yordamın MBCS sürümüne eşlenmesine neden olur.

    #define _tcschr _mbschr
    

    Bu yaklaşımı benimsediğinizde, dize bağımsız değişkenleri ve dize dönüş değerleri için uygun veri türlerinin kullanıldığından emin olmanız gerekir. Uygun tür eşleştirmesini sağlamak için tür atamayı veya genel metin veri türünü kullanabilirsiniz _TXCHAR . _TXCHAR SBCS koduyla char eşler, ancak MBCS koduyla eşleştir unsigned char . Genel metin makroları hakkında daha fazla bilgi için Bkz. Çalışma Zamanı Kitaplığı Başvurusu'nda Genel Metin Eşlemeleri.

Ayrıca bkz.

Tchar.h'de Genel Metin Eşlemeleri