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 , _mbso wcs , in base alle stresigenze. 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_til 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:

  1. Usare le funzioni inline indipendenti dai tipi in tchar.h. Si tratta del comportamento predefinito.

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

  3. 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 _tcsrevgeneric-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_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