42 votes

Que veut dire const point par point en C et en C ++?

Je sais que la règle-de-pouce à lire les déclarations de droite à gauche et j'étais assez sûr que je savais ce qui se passait jusqu'à ce qu'un collègue m'a dit que:

const MyStructure** ppMyStruct;

signifie "ppMyStruct est un pointeur vers un pointeur const d'un (mutable) MyStructure" (en C++).

J'aurais pensé que cela signifiait "ppMyStruct est un pointeur vers un pointeur vers un const MyStructure". J'ai cherché une réponse dans le C++ spec, mais apparemment, je ne suis pas très bon à ça...

Que veut dire en C++, et signifie la même chose en C?

64voto

James Hopkin Points 8318

Votre collègue a tort. C'est un pointeur (non-const) vers un pointeur (non-const) vers une const MyStructure. En C et C ++.

61voto

flolo Points 8757

Dans ce cas, l'outil cdecl (ou c ++ décl) peut être utile:

      [flolo@titan ~]$ cdecl explain "const struct s** ppMyStruct"
     declare ppMyStruct as pointer to pointer to const struct s
 

22voto

efotinis Points 6338

Vous avez eu raison dans votre interprétation. Voici une autre façon de voir les choses:

 const MyStructure *      *ppMyStruct;        // ptr --> ptr --> const MyStructure
      MyStructure *const *ppMyStruct;        // ptr --> const ptr --> MyStructure
      MyStructure *      *const ppMyStruct;  // const ptr --> ptr --> MyStructure
 

Ce sont toutes les alternatives d'un pointeur à pointeur avec un qualificatif const. La règle de droite à gauche peut être utilisée pour déchiffrer les déclarations (au moins en C ++; je ne suis pas un expert en C).

5voto

csl Points 5401

Votre collègue a tort et il en va de même pour C et C ++. Essayez ce qui suit:

 typedef struct foo_t {
    int i;
} foo_t;

int main()
{
    foo_t f = {123};
    const foo_t *p = &f;
    const foo_t **pp = &p;
    printf("f.i = %d\n", (*pp)->i);
    (*pp)->i = 888; // error
    p->i = 999;     // error
}
 

Visual C ++ 2008 génère les erreurs suivantes pour les deux dernières lignes:

 error C2166: l-value specifies const object
error C2166: l-value specifies const object
 

GCC 4 dit:

 error: assignment of read-only location '**pp'
error: assignment of read-only location '*p'
 

G ++ 4 dit:

 error: assignment of data-member 'foo_t::i' in read-only structure
error: assignment of data-member 'foo_t::i' in read-only structure
 

5voto

xtofl Points 22333

Vous avez raison

Une autre réponse indiquait déjà la " règle du sens horaire ". J'ai bien aimé celui-là - un peu élaboré, cependant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X