Quelle est la différence entre le qualificatif const en C et le qualificatif const en C ++?

9

J'ai trouvé un commentaire de l'utilisateur R .. :

C et C ++ ne sont pas le même langage. En particulier, C constn'a rien à voir avec C ++ const.

Je sais, qu'une différence entre le constqualificatif en C et le constqualificatif en C ++ est son lien par défaut.

Un objet déclaré à la portée de l'espace de noms avec constqualificatif en C ++ a une liaison interne, tandis qu'en C un objet avec constqualificatif déclaré à portée globale (sans avoir de staticqualificatif avant const) a une liaison externe.

Mais comment diffèrent-ils tous les deux entre les langages de C et C ++? J'ai pensé que les deux ont le même type de concept et de but dans les deux langues.

Ma question:

  • Quelle est la différence entre le qualificatif const en C et le qualificatif const en C ++?

Les réponses à Comment "const" diffère-t-il en C et C ++? ne pointez pas de différence exacte entre les langages de C et C ++ dans le contexte du constqualificatif. Seulement ce que vous ne pouvez pas faire ou pouvez faire avec dans une certaine langue.

RobertS soutient Monica Cellio
la source
Autant de réponses à une simple recherche sur Google. L'un d'eux: stackoverflow.com/questions/4486442/…
schaiba
1
En C, constn'a rien à voir avec la liaison. Vous pouvez avoir static constà portée de fichier et il a un lien interne,
Lundin
3
Si vous n'êtes pas satisfait des réponses actuelles à cette question - qui est la même que la vôtre - envisagez de publier une prime dessus.
Sneftel
3
J'accepte que le doublon lié soit mauvais. Une bonne réponse énumérerait toutes les différences et constn'expliquerait pas tant ce qui fait la même chose dans les deux langues.
Lundin
1
Je peux essayer d'écrire une telle réponse mais je ne suis pas assez gourou en C ++ pour être sûr d'avoir couvert toutes les différences. En haut de ma tête: les variables const en C ++ sont des expressions constantes, contrairement à C. C ++ peut const qualifier les fonctions membres. Le lien mentionné. Rien d'autre?
Lundin

Réponses:

11
  • La différence la plus importante est qu'en C ++, une constvariable est une expression constante (même avant l'introduction de C ++ 11 constexpr), mais pas une constvariable en C.

    Cela signifie que C ++ vous permet de faire des choses comme const size_t n = 1; static int array[n];mais C ne le permet pas, soi-disant pour des raisons historiques.

  • En C ++, constjoue un rôle dans la détermination de la liaison. Ceci est différent entre les versions C ++. Selon cppreference.com (c'est moi qui souligne):

    L'un des noms suivants déclarés à la portée de l'espace de noms a une liaison interne:


    • non volatile non modèle (depuis C ++ 14) non en ligne (depuis C ++ 17) non exporté (depuis C ++ 20) variables qualifiées const (y compris constexpr) qui ne sont pas déclarées extern et aren ' t précédemment déclaré avoir un lien externe;

    Alors qu'en C, constne joue aucun rôle dans la détermination de la liaison - seuls les spécificateurs de portée de déclaration et de classe de stockage sont importants.

  • En C ++, vous pouvez constqualifier les fonctions membres. Cela n'est pas possible en C car il ne prend pas en charge la syntaxe des fonctions membres.

  • C permet de constdéclarer des variables qualifiées sans initialiseur. En C, nous pouvons écrire const int x;sans initialiseurs, mais C ++ ne le permet pas. À première vue, cela peut sembler être un bogue de langage insensé en C, mais la raison est que les ordinateurs ont des registres matériels en lecture seule avec des valeurs définies par le matériel, pas par le logiciel. Cela signifie que C reste adapté à la programmation liée au matériel.

Lundin
la source
Pouvez-vous avoir des fonctions membres en C?
Maxim Egorushkin
1
Notez que cela const size_t n = 1; static int array[n];ne fonctionne que si le compilateur peut voir la définition de net faire une propagation constante. extern const size_t n; static int array[n];ne fonctionne pas.
Maxim Egorushkin
Hm, je vois plutôt ces registres de matériel informatique adressés via des pointeurs, comme uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...
Aconcagua
@Aconcagua Cela rendrait ces registres incompatibles avec le reste de la carte des registres. Et comment cela vous permettrait-il de visualiser les valeurs réelles du registre dans un débogueur? Par exemple, si vous souhaitez simplement afficher les registres de jeu de masques de silicium en lecture seule pour voir rapidement la partie avec laquelle vous vous êtes retrouvé. Et évidemment, vous devez également volatilequalifier le pointeur.
Lundin
@Lundin Admis, n'a pas fait attention au volatile... Le reste dépend. Les débogueurs que j'avais à la main dans ces cas pouvaient également être facilement résolus *x. D'un autre côté, si les registres sont mappés sur une région de mémoire et que le compilateur ne prend pas directement en charge le placement de variables à des emplacements de mémoire spécifiques (j'ai vu les deux), obtenir la variable à un emplacement de mémoire spécifique peut parfois devenir un peu compliqué (avoir à couvrir cela dans le fichier de carte ...). En fin de compte, je ne me soucie pas beaucoup d'avoir une variable située au bon endroit ou un pointeur, tant que je peux faire la tâche qui m'est assignée;)
Aconcagua
0

De cppreference.com :

Le constqualificatif utilisé sur une déclaration d'une variable non locale non volatile non modèle (depuis C ++ 14) non en ligne (depuis C ++ 17) qui n'est pas déclarée externlui donne un lien interne. Ceci est différent de C où constles variables de portée de fichier ont un lien externe.

Autre que cela consta la même sémantique en C et C ++ et les en-têtes C constsont souvent compilés en tant qu'en-têtes C ++ avec conditionnel "extern C".

Maxim Egorushkin
la source
1
C'est une mauvaise citation, une simplification excessive. static const x;à la portée du fichier en C a un lien interne. Le lien d'une variable C est déterminé par l'étendue dans laquelle elle est déclarée, ainsi que par la présence / absence de spécificateurs de classe de stockage. constet les autres qualificatifs de type n'en jouent pas du tout.
Lundin
@Lundin En quoi est-ce différent de ce que dit la citation?
Maxim Egorushkin
1
L'exemple que je viens de donner prouve que la citation est fausse. Selon la citation, static const x;la portée du fichier en C a un lien externe.
Lundin
@Lundin La citation dit qu'en int const x = 1C a un lien externe . Par conséquent, vous devez staticmodifier la liaison en interne. La citation est assez claire pour moi, contrairement à vos commentaires.
Maxim Egorushkin
1
Cela ne dit vraiment rien du tout. Lisez la citation. "... C où les variables de portée du fichier const ont un lien externe".
Lundin