Mappature di testo generico in Tchar.h

Aggiornamento: novembre 2007

Allo scopo di semplificare il trasporto del codice per l'utilizzo internazionale, la libreria di runtime Microsoft fornisce mappature di testo generico specifiche di Microsoft per molti tipi di dati, routine e altri oggetti. È possibile utilizzare queste mappature, definite in Tchar.h, per scrivere codice generico che può essere compilato per il formato a byte singolo, multibyte o Unicode, a seconda delle costanti di manifesto definite mediante un'istruzione #define. Le mappature di testo generico sono estensioni Microsoft non compatibili con lo standard ANSI.

Se si utilizza il file Tchar.h, è possibile generare applicazioni a byte singolo, MBCS e Unicode a partire dallo stesso codice sorgente. Tchar.h definisce le macro caratterizzate dal prefisso _tcs che, con le corrette definizioni del preprocessore, corrispondono, a seconda dei casi, alla funzione str, _mbs o wcs. Per generare applicazioni per il formato MBCS, definire il simbolo _MBCS. Per generare un'applicazione per il formato Unicode, definire il simbolo _UNICODE. Per generare un'applicazione a byte singolo, non definire nessuno dei due formati; questa è l'impostazione predefinita. In base all'impostazione predefinita, per le applicazioni MFC viene definito _MBCS.

Il tipo di dati _TCHAR è definito in modo condizionale in Tchar.h. Se il simbolo _UNICODE è definito per la build, _TCHAR viene definito come wchar_t. In caso contrario, per build a byte singolo e MBCS, viene definito come char. (wchar_t, il tipo di dati di base dei caratteri di tipo "wide" Unicode, è l'equivalente a 16 bit di un char con segno a 8 bit. Per le applicazioni internazionali, utilizzare la famiglia di funzioni _tcs, che opera con le unità di _TCHAR e non con i byte. _tcsncpy, ad esempio, copia n**_TCHAR** e non n byte.

Poiché alcune funzioni di gestione delle stringhe SBCS utilizzano parametri char* (con segno), quando viene definito _MBCS, verrà visualizzato un messaggio di avviso del compilatore per segnalare un tipo non corrispondente. Questo messaggio di avviso può essere evitato in tre modi, come indicato di seguito in ordine di efficacia.

  1. Utilizzando i thunk delle funzioni inline "indipendenti dai tipi" in Tchar.h. Si tratta del comportamento predefinito.

  2. Utilizzando le macro dirette in Tchar.h mediante la definizione di _MB_MAP_DIRECT nella riga di comando. Se si esegue questa operazione, è necessario abbinare i tipi in modo manuale. È il metodo più veloce, ma non è indipendente dai tipi.

  3. Utilizzando i thunk delle funzioni di libreria collegata staticamente indipendente dai tipi in Tchar.h. Per eseguire questa operazione, definire la costante _NO_INLINING nella riga di comando. Si tratta del metodo meno veloce, ma è anche quello che garantisce una maggiore indipendenza dai tipi.

Istruzioni del preprocessore per le mappature di testo generico

#define

Versione compilata

Esempio

_UNICODE

Unicode (caratteri estesi)

_tcsrev corrisponde a _wcsrev

_MBCS

Caratteri multibyte

_tcsrev corrisponde a _mbsrev

Nessuna definizione. Questa è l'impostazione predefinita: non viene definito né _UNICODE_MBCS.

SBCS (ASCII)

_tcsrev corrisponde a strrev

La funzione di testo generico _tcsrev definita in Tchar.h, ad esempio, corrisponde a _mbsrev se nel programma è stato definito _MBCS oppure a _wcsrev se è stato definito _UNICODE. Altrimenti, _tcsrev corrisponde a strrev. Per facilitare la programmazione, vengono fornite in Tchar.h altre mappature di tipi di dati, ma _TCHAR costituisce la più utile.

Mappature di tipi di dati di testo generico

Testo generico

Nome tipo di dati

_UNICODE &

_MBCS non definito

_MBCS

definito

_UNICODE

definito

_TCHAR

char

char

wchar_t

_TINT

int

int

wint_t

_TSCHAR

signed char

signed char

wchar_t

_TUCHAR

unsigned char

unsigned char

wchar_t

_TXCHAR

char

unsigned char

wchar_t

_T o _TEXT

Nessun effetto (eliminato dal preprocessore)

Nessun effetto (eliminato dal preprocessore)

L (converte il carattere o la stringa che precede nell'equivalente Unicode)

Per un elenco completo delle mappature di testo generico delle routine, delle variabili e di altri oggetti, vedere Mappature di testo generico in Riferimenti alla libreria di runtime.

Nota:

Non utilizzare la famiglia di funzioni str con le stringhe Unicode, che possono contenere byte null. In modo analogo, non utilizzare la famiglia di funzioni wcs con le stringhe MBCS, o SBCS.

Nei seguenti frammenti di codice viene illustrato l'utilizzo di _TCHAR e _tcsrev per impostare mappature con i modelli MBCS, Unicode e SBCS:

_TCHAR *RetVal, *szString;
RetVal = _tcsrev(szString);

Se è stato definito _MBCS, il preprocessore tradurrà il codice come segue:

char *RetVal, *szString;
RetVal = _mbsrev(szString);

Se è stato definito _UNICODE, il preprocessore tradurrà il codice come segue:

wchar_t *RetVal, *szString;
RetVal = _wcsrev(szString);

Se non è stato definito né _MBCS_UNICODE, il preprocessore tradurrà il codice in modo da utilizzare il codice ASCII a byte singolo come segue:

char *RetVal, *szString;
RetVal = strrev(szString);

Di conseguenza, è possibile scrivere, gestire e compilare un unico file di codice sorgente per eseguirlo con routine specifiche per uno dei tre tipi di set di caratteri.

Vedere anche

Concetti

Set di caratteri in C++

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