Utilisation de types de données TCHAR.H avec _MBCS
Lorsque la constante _MBCS
de manifeste est définie, une routine de texte générique donnée est mappée à l’un des types de routines suivants :
Une routine SBCS qui gère correctement les chaînes, caractères et caractères multioctets. Dans ce cas, les arguments de chaîne doivent être de type
char*
. Par exemple,_tprintf
est mappé surprintf
; les arguments de chaîne dansprintf
sont de typechar*
. Si vous utilisez le type de données de texte générique_TCHAR
pour vos types de chaîne, les types de paramètre formels et réels pourprintf
correspondent car_TCHAR*
est mappé surchar*
.Une routine spécifique à MBCS. Dans ce cas, les arguments de chaîne doivent être de type
unsigned char*
. Par exemple,_tcsrev
est mappé sur_mbsrev
, qui attend et retourne une chaîne de typeunsigned char*
. Si vous utilisez le_TCHAR
type de données de texte générique pour vos types de chaînes, il existe un conflit de type potentiel, car_TCHAR
mappe au typechar
.
Voici les trois solutions pour empêcher ce conflit de types (et les avertissements du compilateur C ou erreurs du compilateur C++ qui en découleraient) :
Utiliser le comportement par défaut. tchar.h fournit des prototypes de routine de texte générique pour les routines dans les bibliothèques d’exécution, comme dans l’exemple suivant.
char * _tcsrev(char *);
Dans le cas par défaut, le prototype de
_tcsrev
mappage à_mbsrev
travers un thunk dans Libc.lib. Cela modifie les types des_mbsrev
paramètres entrants et de la valeur de retour sortante de_TCHAR*
(autrement dit,char *
) enunsigned char *
. Cette méthode garantit la correspondance de type lorsque vous utilisez_TCHAR
, mais elle est relativement lente en raison de la surcharge des appels de fonction.Utilisez la fonction inline en incorporant l’instruction du préprocesseur suivante dans votre code.
#define _USE_INLINING
Cette méthode provoque un thunk de fonction inline, fourni dans tchar.h, pour mapper la routine de texte générique directement à la routine Mo CS appropriée. L’extrait de code suivant de tchar.h fournit un exemple de la façon dont cela est fait.
__inline char *_tcsrev(char *_s1) {return (char *)_mbsrev((unsigned char *)_s1);}
Si vous pouvez utiliser l’incorporation, il s’agit de la meilleure solution, car elle garantit une correspondance de types et ne présente aucun coût supplémentaire en termes de temps.
Utilisez le mappage direct en incorporant l’instruction de préprocesseur suivante dans votre code.
#define _MB_MAP_DIRECT
Cette approche constitue une alternative rapide si vous ne souhaitez pas utiliser le comportement par défaut ou que vous ne pouvez pas utiliser l’incorporation. Elle entraîne le mappage de la routine de texte générique par une macro directement à la version Mo CS de la routine, comme dans l’exemple suivant de tchar.h.
#define _tcschr _mbschr
Lorsque vous suivez cette approche, vous devez veiller à utiliser les types de données appropriés pour les arguments de chaîne et les valeurs de retour de chaîne. Vous pouvez utiliser la conversion de type pour assurer la bonne correspondance des types, ou vous pouvez utiliser le type de données de texte générique
_TXCHAR
._TXCHAR
correspond au typechar
dans le code SBCS, mais est mappé sur le typeunsigned char
dans le code MBCS. Pour plus d’informations sur les macros de texte générique, consultez Mappages de texte générique dans la référence de la bibliothèque d’exécution.