Partager via


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é sur printf ; les arguments de chaîne dans printf sont de type char*. 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 pour printf correspondent car _TCHAR* est mappé sur char*.

  • 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 type unsigned 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 type char.

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 *) en unsigned 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 type char dans le code SBCS, mais est mappé sur le type unsigned 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.

Voir aussi

Mappages de texte générique dans tchar.h