Using TCHAR.H Data Types with _MBCSUsing TCHAR.H Data Types with _MBCS

Sezione specifica MicrosoftMicrosoft Specific

Come indicato nella tabella dei mapping di routine di testo generico (vedere Mapping testo generico), quando la costante manifesto _MBCS è definita, una routine di testo generico specifica esegue il mapping a uno dei tipi di routine seguenti:As the table of generic-text routine mappings indicates (see Generic-Text Mappings), when the manifest constant _MBCS is defined, a given generic-text routine maps to one of the following kinds of routines:

  • Una routine SBCS che gestisce in modo corretto byte, caratteri e stringhe multibyte.An SBCS routine that handles multibyte bytes, characters, and strings appropriately. In questo caso, il tipo previsto per gli argomenti della stringa è char*.In this case, the string arguments are expected to be of type char*. Ad esempio, _tprintf viene mappata a printf e gli argomenti di stringa passati a printf sono di tipo char*.For example, _tprintf maps to printf; the string arguments to printf are of type char*. Se per i tipi stringa si usa il tipo di dati di testo generico _TCHAR, i tipi di parametro formali ed effettivi di printf corrisponderanno, poiché _TCHAR* è mappato a char*.If you use the _TCHAR generic-text data type for your string types, the formal and actual parameter types for printf match because _TCHAR* maps to char*.

  • Una routine specifica di MBCS.An MBCS-specific routine. In questo caso, il tipo previsto per gli argomenti della stringa è unsigned char*.In this case, the string arguments are expected to be of type unsigned char*. Ad esempio, _tcsrev viene mappato a _mbsrev, che accetta e restituisce una stringa di tipo unsigned char*.For example, _tcsrev maps to _mbsrev, which expects and returns a string of type unsigned char*. Anche in questo caso, se per i tipi di stringa si usa il tipo di dati a testo generico _TCHAR, è possibile che si verifichi un conflitto di tipi, poiché _TCHAR è mappato al tipo char.Again, if you use the _TCHAR generic-text data type for your string types, there is a potential type conflict because _TCHAR maps to type char.

    Di seguito sono riportate tre soluzioni che consentono di evitare questo conflitto di tipi e la conseguente visualizzazione dei messaggi di avviso del compilatore C o degli errori del compilatore C++:Following are three solutions for preventing this type conflict (and the C compiler warnings or C++ compiler errors that would result):

  • Usare il comportamento predefinitoUse the default behavior. TCHAR.H fornisce prototipi di routine a testo generico per le routine nelle librerie run-time, come illustrato nell'esempio seguente.TCHAR.H provides generic-text routine prototypes for routines in the run-time libraries, as in the following example.

    char *_tcsrev(char *);  
    

    Nel caso predefinito, il prototipo per _tcsrev è mappato a _mbsrev tramite un thunk in LIBC.LIB.In the default case, the prototype for _tcsrev maps to _mbsrev through a thunk in LIBC.LIB. In questo modo, i tipi dei parametri di _mbsrev in ingresso e il valore restituito in uscita vengono modificati da _TCHAR * (ad esempio char *) a unsigned char *.This changes the types of the _mbsrev incoming parameters and outgoing return value from _TCHAR * (such as char *) to unsigned char *. Questo metodo assicura la corrispondenza dei tipi quando si usa _TCHAR, ma è relativamente lento a causa del sovraccarico di chiamate di funzione.This method ensures type matching when you are using _TCHAR, but it is relatively slow because of the function call overhead.

  • Usare l'incorporamento della funzione, incorporando nel codice l'istruzione del preprocessore seguente.Use function inlining by incorporating the following preprocessor statement in your code.

    #define _USE_INLINING  
    

    Questo metodo fa in modo che il thunk della funzione inline, fornito in TCHAR.H, esegua il mapping della routine a testo generico direttamente alla routine MBCS appropriata,This method causes an inline function thunk, provided in TCHAR.H, to map the generic-text routine directly to the appropriate MBCS routine. come illustrato nel segmento di codice tratto da TCHAR.H riportato di seguito.The following code excerpt from TCHAR.H provides an example of how this is done.

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

    Se è possibile usarlo, l'incorporamento rappresenta la soluzione migliore, poiché garantisce la corrispondenza dei tipi e non presenta costi aggiuntivi in termini di tempo.If you can use inlining, this is the best solution, because it guarantees type matching and has no additional time cost.

  • Usare il mapping diretto, incorporando nel codice l'istruzione del preprocessore seguente.Use "direct mapping" by incorporating the following preprocessor statement in your code.

    #define _MB_MAP_DIRECT  
    

    Se non si vuole usare il funzionamento predefinito o se non è possibile usare l'incorporamento, questo approccio è una rapida alternativa.This approach provides a fast alternative if you do not want to use the default behavior or cannot use inlining. In questo modo, la routine a testo generico viene mappata da una macro direttamente alla versione MBCS della routine, come illustrato nel seguente esempio tratto da TCHAR.H.It causes the generic-text routine to be mapped by a macro directly to the MBCS version of the routine, as in the following example from TCHAR.H.

    #define _tcschr _mbschr  
    

    Se si adotta questo approccio, è necessario prestare molta attenzione per assicurare l'uso di tipi di dati appropriati per gli argomenti stringa e per i valori stringa restituiti.When you take this approach, you must be careful to ensure that appropriate data types are used for string arguments and string return values. Per garantire la corrispondenza corretta dei tipi, è possibile usare il cast dei tipi oppure il tipo di dati a testo generico _TXCHAR.You can use type casting to ensure proper type matching or you can use the _TXCHAR generic-text data type. _TXCHARviene mappato al tipo char nel codice SBCS, ma viene mappato al tipo unsigned char nel codice MBCS._TXCHAR maps to type char in SBCS code but maps to type unsigned char in MBCS code. Per altre informazioni sulle macro a testo generico, vedere Mapping testo generico.For more information about generic-text macros, see Generic-Text Mappings.

    Fine sezione specifica MicrosoftEND Microsoft Specific

Vedere ancheSee Also

Internazionalizzazione Internationalization
Routine di runtime per categoriaRun-Time Routines by Category