C++ typedef interprétation de pointeurs const
Premièrement, les codes de l'échantillon:
Cas 1:
typedef char* CHARS;
typedef CHARS const CPTR; // constant pointer to chars
le remplacement textuel des caractères devient:
typedef char* const CPTR; // still a constant pointer to chars
cas 2:
typedef char* CHARS;
typedef const CHARS CPTR; // constant pointer to chars
le remplacement textuel des caractères devient:
typedef const char* CPTR; // pointer to constant chars
dans le cas 2, après le remplacement textuel des caractères, la signification du typedef a changé. Pourquoi est-ce donc? Comment C++ interprète-t-il cette définition?
2 réponses
il n'y a pas de raison d'analyser typedef
comportement sur la base des textes de remplacement. Les noms Typedef ne sont pas des macros, ils ne sont pas remplacés textuellement.
Comme vous l'avez noté vous-même
typedef CHARS const CPTR;
est la même chose que
typedef const CHARS CPTR;
C'est donc pour la même raison pourquoi
typedef const int CI;
a le même sens que
typedef int const CI;
Typedef-name ne définit pas de nouveaux types( seulement des alias aux existants), mais ils sont "atomiques" dans un sens que tout qualificatifs (comme const
) s'appliquent à un niveau très haut, c'est à dire qu'ils s'appliquent à l' type caché derrière le nom typedef. Une fois que vous avez défini un nom typedef, vous ne pouvez pas "injecter" un qualificatif pour qu'il modifie les niveaux plus profonds du type.
Typedef n'est pas une simple substitution textuelle.
typedef const CHARS CPTR;
signifie "le type de CPTR sera une chose de const CHARS."Mais char est un type pointeur-à-char, donc cela dit "le type CPTR sera un type const pointeur-à-char."Cela ne correspond pas à ce que vous voyez lorsque vous faites une simple substitution.
En d'autres termes,
typedef char * CHARS;
de la même façon que
#define CHARS char *
la syntaxe typedef est comme une déclaration variable, sauf que au lieu de déclarer que le nom cible est une variable, il le déclare comme un nouveau nom de type qui peut être utilisé pour déclarer des variables du type que la variable serait sans le typedef.
voici un processus simple pour comprendre ce qu'un typedef déclare:
Supprimer
typedef
mot clé. Maintenant vous avez une déclaration variable.const CHARS CPTR;
comprendre quel type est cette variable (certains compilateurs ont un
typeof()
opérateur qui fait exactement cela et est très utile). Appelez ce type T. Dans ce cas, un pointeur constant vers char (non-constant).Remplacer
typedef
. Vous déclarez maintenant un nouveau type (CPTR
) qui est exactement du même type que T, un pointeur constant vers char (non-constant).