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 aprintf
e gli argomenti di stringa passati aprintf
sono di tipochar*
. Se per i tipi stringa si usa il tipo di dati di testo generico_TCHAR
, i tipi di parametro formali ed effettivi diprintf
corrisponderanno, poiché_TCHAR*
è mappato achar*
.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 tipounsigned 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 tipochar
.
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 inunsigned 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
._TXCHAR
viene mappato al tipochar
nel codice SBCS, ma viene mappato al tipounsigned 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.