Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
Utilizzando i thunk delle funzioni inline "indipendenti dai tipi" in Tchar.h. Si tratta del comportamento predefinito.
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.
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 né _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 né _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.
Nota: