Mapping di testo generico in tchar.h
Per semplificare il trasporto di codice per l'uso internazionale, la libreria di runtime Microsoft fornisce mapping di testo generici specifici di Microsoft per molti tipi di dati, routine e altri oggetti. È possibile usare questi mapping, definiti in tchar.h, per scrivere codice generico che può essere compilato per set di caratteri a byte singolo, multibyte o Unicode, a seconda di una costante manifesto definita tramite un'istruzione #define
. I mapping di testo generico sono estensioni Microsoft non compatibili con ANSI.
Usando tchar.h, è possibile creare applicazioni a byte singolo, Multibyte Character Set (MBCS) e Unicode dalle stesse origini. tchar.h definisce le macro (con il prefisso _tcs
) che, con le definizioni del preprocessore corrette, eseguono il mapping a funzioni , _mbs
o wcs
, in base alle str
esigenze. Per compilare MBCS, definire il simbolo _MBCS
. Per compilare Unicode, definire il simbolo _UNICODE
. Per compilare un'applicazione a byte singolo, definire nessuno dei due (impostazione predefinita). Per impostazione predefinita, _UNICODE
è definito per le applicazioni MFC.
Il _TCHAR
tipo di dati viene definito in modo condizionale in tchar.h. Se il simbolo _UNICODE
viene definito per la compilazione, _TCHAR
viene definito come wchar_t
; in caso contrario, per le compilazioni a byte singolo e MBCS, viene definito come char
. (wchar_t
il tipo di dati wide-character Unicode di base è la controparte a 16 bit di un elemento a 8 bit signed char
). Per le applicazioni internazionali, usare la _tcs
famiglia di funzioni, che operano in _TCHAR
unità, non byte. Ad esempio, _tcsncpy
copia n
_TCHARs
, non n
byte.
Poiché alcune funzioni di gestione delle stringhe SBCS (Single Byte Character Set) accettano parametri (firmati), char*
quando viene definito un avviso _MBCS
del compilatore di tipo non corrispondente. Esistono tre modi per evitare questo avviso:
Usare le funzioni inline indipendenti dai tipi in tchar.h. Questo è il comportamento predefinito.
Usare le macro dirette in tchar.h definendo
_MB_MAP_DIRECT
nella riga di comando. In questo caso, è necessario abbinare manualmente i tipi. Questo è il metodo più veloce, ma non è indipendente dai tipi.Usare la funzione libreria collegata in modo statico indipendente dai tipi in tchar.h. A tale scopo, definire la costante
_NO_INLINING
nella riga di comando. Questo è il metodo più lento, ma quello più indipendente dai tipi.
Direttive del preprocessore per i mapping di testo generico
# define | Versione compilata | Esempio |
---|---|---|
_UNICODE |
Unicode (caratteri wide) | _tcsrev esegue il mapping a _wcsrev |
_MBCS |
Caratteri multibyte | _tcsrev esegue il mapping a _mbsrev |
Nessuno (il valore predefinito non ha né _UNICODE _MBCS definito) |
SBCS (ASCII) | _tcsrev esegue il mapping a strrev |
Ad esempio, la funzione _tcsrev
generic-text , definita in tchar.h, esegue il mapping a _mbsrev
se definita _MBCS
nel programma o a _wcsrev
se è stata definita _UNICODE
. In caso contrario, _tcsrev
è mappata a strrev
. Altri mapping dei tipi di dati sono disponibili in tchar.h per praticità di programmazione, ma _TCHAR
è il più utile.
Mapping dei 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 |
unsigned int |
wint_t |
_TSCHAR |
signed char |
signed char |
wchar_t |
_TUCHAR |
unsigned char |
unsigned char |
wchar_t |
_TXCHAR |
char |
unsigned char |
wchar_t |
_T oppure _TEXT |
Nessun effetto (rimosso dal preprocessore) | Nessun effetto (rimosso dal preprocessore) | L (converte il carattere o la stringa seguente nella controparte Unicode) |
Per un elenco di mapping di testo generico di routine, variabili e altri oggetti, vedere Mapping di testo generico nella guida di riferimento alla libreria di runtime.
Nota
Non usare la str
famiglia di funzioni con stringhe Unicode, che probabilmente contengono byte Null incorporati. Analogamente, non usare la wcs
famiglia di funzioni con stringhe MBCS (o SBCS).
Nei seguenti frammenti di codice viene illustrato l'utilizzo di _TCHAR
e _tcsrev
per il mapping a modelli MBSC, Unicode e SBCS.
_TCHAR *RetVal, *szString;
RetVal = _tcsrev(szString);
Se _MBCS
è stato definito, il preprocessore esegue il mapping di questo frammento a questo codice:
char *RetVal, *szString;
RetVal = _mbsrev(szString);
Se _UNICODE
è stato definito, il preprocessore esegue il mapping di questo frammento a questo codice:
wchar_t *RetVal, *szString;
RetVal = _wcsrev(szString);
Se né _MBCS
né _UNICODE
sono stati definiti, il preprocessore esegue il mapping del frammento al codice ASCII a byte singolo, come indicato di seguito:
char *RetVal, *szString;
RetVal = strrev(szString);
Pertanto, è possibile scrivere, gestire e compilare un file di codice sorgente singolo da eseguire con routine specifiche di uno dei tre tipi di set di caratteri.
Vedi anche
Testo e stringhe
Uso dei tipi di dati di TCHAR.H con il codice _MBCS