Utilizzo dei tipi di dati di TCHAR.H con il codice _MBCS

Quando viene definita la costante _MBCS manifesto, una routine di testo generico specificata esegue il mapping a uno dei tipi di routine seguenti:

  • Una routine SBCS che gestisce in modo corretto byte, caratteri e stringhe multibyte. In questo caso, il tipo previsto per gli argomenti della stringa è char*. Ad esempio, _tprintf viene mappata a printf e gli argomenti di stringa passati a printf sono di tipo 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*.

  • Una routine specifica di MBCS. In questo caso, il tipo previsto per gli argomenti della stringa è unsigned char*. Ad esempio, _tcsrev viene mappato a _mbsrev, che accetta e restituisce una stringa di tipo unsigned char*. Se si usa il _TCHAR tipo di dati generico-text per i tipi stringa, si verifica un potenziale conflitto di tipo perché _TCHAR esegue il mapping al tipo 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++:

  • Usare il comportamento predefinito tchar.h fornisce prototipi di routine di testo generico per le routine nelle librerie di runtime, come nell'esempio seguente.

    char * _tcsrev(char *);
    

    Nel caso predefinito, il prototipo per _tcsrev esegue il mapping a _mbsrev attraverso un thunk in Libc.lib. In questo modo i tipi dei parametri in ingresso e il _mbsrev valore restituito in uscita da _TCHAR* (ovvero , char *) vengono modificati in unsigned char *. Questo metodo garantisce la corrispondenza dei tipi quando si usa _TCHAR, ma è relativamente lento a causa del sovraccarico della chiamata di funzione.

  • Usare l'incorporamento della funzione, incorporando nel codice l'istruzione del preprocessore seguente.

    #define _USE_INLINING
    

    Questo metodo fa in modo che una funzione inline venga usata in tchar.h per eseguire il mapping diretto della routine generica-text alla routine MBCS appropriata. L'estratto di codice seguente di tchar.h fornisce un esempio di come viene eseguita questa operazione.

    __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.

  • Usare il mapping diretto incorporando l'istruzione del preprocessore seguente nel codice.

    #define _MB_MAP_DIRECT
    

    Se non si vuole usare il funzionamento predefinito o se non è possibile usare l'incorporamento, questo approccio è una rapida alternativa. Fa in modo che la routine di testo generico venga mappata direttamente da una macro alla versione MBCS della routine, come nell'esempio seguente di tchar.h.

    #define _tcschr _mbschr
    

    Quando si usa questo approccio, è necessario prestare attenzione a garantire l'uso dei tipi di dati appropriati per gli argomenti stringa e i valori restituiti di stringhe. Per garantire la corrispondenza corretta dei tipi, è possibile usare il cast dei tipi oppure il tipo di dati a testo generico _TXCHAR. _TXCHARviene mappato al tipo char nel codice SBCS, ma viene mappato al tipo unsigned char nel codice MBCS. Per altre informazioni sulle macro di testo generico, vedere Mapping di testo generico nella guida di riferimento alla libreria di runtime.

Vedi anche

Mapping di testo generico in tchar.h