J'ai trouvé un commentaire de l'utilisateur R .. :
C et C ++ ne sont pas le même langage. En particulier, C
const
n'a rien à voir avec C ++const
.
Je sais, qu'une différence entre le const
qualificatif en C et le const
qualificatif en C ++ est son lien par défaut.
Un objet déclaré à la portée de l'espace de noms avec const
qualificatif en C ++ a une liaison interne, tandis qu'en C un objet avec const
qualificatif déclaré à portée globale (sans avoir de static
qualificatif 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 const
qualificatif. Seulement ce que vous ne pouvez pas faire ou pouvez faire avec dans une certaine langue.
la source
const
n'a rien à voir avec la liaison. Vous pouvez avoirstatic const
à portée de fichier et il a un lien interne,const
n'expliquerait pas tant ce qui fait la même chose dans les deux langues.Réponses:
La différence la plus importante est qu'en C ++, une
const
variable est une expression constante (même avant l'introduction de C ++ 11constexpr
), mais pas uneconst
variable 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 ++,
const
joue 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):Alors qu'en C,
const
ne 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
const
qualifier 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
const
déclarer des variables qualifiées sans initialiseur. En C, nous pouvons écrireconst 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.la source
const size_t n = 1; static int array[n];
ne fonctionne que si le compilateur peut voir la définition den
et faire une propagation constante.extern const size_t n; static int array[n];
ne fonctionne pas.uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);
...volatile
qualifier le pointeur.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;)De cppreference.com :
Autre que cela
const
a la même sémantique en C et C ++ et les en-têtes Cconst
sont souvent compilés en tant qu'en-têtes C ++ avec conditionnel"extern C"
.la source
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.const
et les autres qualificatifs de type n'en jouent pas du tout.static const x;
la portée du fichier en C a un lien externe.int const x = 1
C a un lien externe . Par conséquent, vous devezstatic
modifier la liaison en interne. La citation est assez claire pour moi, contrairement à vos commentaires.