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?

19
demandé sur jasonline 2010-02-12 20:27:20

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.

33
répondu AnT 2010-02-12 19:18:36

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:

  1. Supprimer typedef mot clé. Maintenant vous avez une déclaration variable.

    const CHARS CPTR;
    
  2. 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).

  3. 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).

12
répondu Tim Schaeffer 2012-07-14 03:12:27