60 votes

La correction des constantes en C et C++

Je comprends ce que signifie la constance correcte et ma question ne porte pas sur ce qu'est la constance correcte. Je n'attends donc pas d'explication ou de liens C++-FAQ à ce sujet.

Mes questions sont les suivantes :

  • Quelles sont les différences sémantiques entre const en C et const en C++ ? et
  • Quelle est la raison de cette différence ?

Il serait bon d'avoir des citations des normes respectives qui précisent les différences.

Je passe régulièrement du C au C++ et j'aimerais connaître les points importants qu'il faut garder à l'esprit en le faisant.

Je n'arrive pas à me souvenir de la raison pour laquelle ils ont été créés (merci si vous pouvez fournir un raisonnement), mais du haut de mon esprit, je m'en souviens :

  • Les variables constantes en C++ ont un lien interne par défaut, alors qu'en C elles ont un lien externe par défaut ;
  • Les objets const peuvent être utilisés comme valeurs de compilation en C++, mais ne peuvent pas être utilisés comme valeurs de compilation en C ;
  • Les pointeurs vers les littéraux de chaîne doivent être des char const* en C++ mais en C il peut être char* .

Qu'est-ce que je rate ?

26voto

James Kanze Points 96599

En plus des différences que vous citez, et des différences de bibliothèque que Steve Jessop mentionne,

char* p1;
char const* const* p2 = &p1;

est légal en C++, mais pas en C. Historiquement, c'est parce que le C l'autorisait à l'origine :

char* p1;
char const** p2 = &p1;

Peu avant que la norme ne soit adoptée, quelqu'un a réalisé que cela perforait un trou dans la sécurité des constantes (puisque *p2 peuvent désormais se voir attribuer un char const* ce qui donne p1 en se voyant attribuer un char const* ) ; avec n'ayant pas eu le temps d'analyser le problème en profondeur, le comité C a interdit tout supplémentaire const autres que les const. de niveau supérieur (c'est-à-dire &p1 peuvent être attribué à un char ** ou un char **const mais pas à un char const** ni un char const* const* .) Le comité C++ a fait une analyse plus approfondie analyse, a réalisé que le problème n'était présent que lorsqu'une const a été suivi d'un niveau non const niveau, et a élaboré la formulation nécessaire formulation nécessaire. (Voir §4.4/4 de la norme).

10voto

Prasanth Madhavan Points 1895

En C const ne produisent pas d'expressions constantes, c'est-à-dire qu'en C, vous ne pouvez pas utiliser une expression const int dans une étiquette de cas, comme largeur de champ de bits ou comme taille de tableau dans une déclaration de tableau non VLA (tout cela est possible en C++). En outre, les objets const ont un lien externe par défaut en C (lien interne en C++). Les règles de const-correctness du langage C++ supportent la conversion standard suivante

int **pp = 0;
const int *const *cpp = pp; // OK in C++

int ***ppp = 0;
int *const *const *cppp = ppp; // OK in C++

Ils ne fonctionneront pas en C.

5voto

Alan Stokes Points 9095

La raison de certaines de ces différences est de nous permettre de nous débarrasser des macros du préprocesseur, ce qui était l'un des premiers objectifs de conception de Bjarne.

En C, on pourrait avoir

 #define MAX_FOOS 10
 int foos[MAX_FOOS];

En C++, nous préférerions pouvoir écrire

 const int max_foos = 10;
 int foos[max_foos];

Pour que cela fonctionne max_foos doit être utilisable dans une expression constante. Elle doit également avoir un lien interne, afin que la définition puisse apparaître dans un en-tête sans provoquer d'erreurs de définition multiples, et surtout pour que le compilateur puisse plus facilement ne pas allouer d'espace de stockage à max_foos .

Lorsque le comité C a adopté const à partir de C++, il n'a pas adopté l'antipathie envers les macros, et n'a donc pas eu besoin de cette sémantique.

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