84 votes

Pourquoi const implique-t-il une liaison interne en C ++, alors que ce n'est pas le cas en C?

Voir sujet. A quoi pensaient-ils?

UPDATE: "statique" a été remplacé par "liaison interne" pour éviter toute confusion.

Pour donner un exemple ... Mettre ce qui suit dans un fichier:

 const int var_a = 1;
int var_b = 1;
 

... et en compilant avec g++ -c test.cpp seulement les exportations var_b .

113voto

Johannes Schaub - litb Points 256113

Je crois que tu veux dire

Pourquoi ne const implique une liaison interne en C++

C'est vrai que si vous déclarez un const objet à portée espace de noms, puis il a une liaison interne.

L'annexe C donne la justification

Le changement: Un nom de fichier de la portée qui est explicitement déclarée const, et pas explicitement déclarées à l'externe, a une liaison interne, alors qu'en C il aurait une liaison externe

Justification: Parce que const objets peuvent être utilisés en tant que moment de la compilation des valeurs en C++, cette fonction demande instamment les programmeurs à fournir explicite initialiseur de valeurs pour chaque const. Cette fonctionnalité permet à l'utilisateur de mettre const objets dans les en-tête des fichiers qui sont inclus dans de nombreuses unités de compilation.

6voto

LBushkin Points 60611

Const et statique sont orthogonaux concepts en C et C++.

L' const mot-clé indique au compilateur d'interdire la variable d'apparaître comme la lvalue de toute expression - essentiellement en lecture seule.

En C, l' static mot a plusieurs usages en fonction de ce qu'il est appliqué. Lorsqu'il est appliqué à une variable d'une fonction, il indique que la variable n'est pas stocké dans la portée d'une fonction, mais est accessible à l'ensemble des invocations. Lorsqu'il est appliqué à une variable globale ou de la fonction, il devient accessible seulement à un fichier particulier - en d'autres termes, elle n'est accessible qu'à l'intérieur de l'unité de compilation (sauf déclaration extern).

En C++, l' static mot-clé peut être utilisé dans une définition de classe, à faire une variable ou de fonctions partagées dans toutes les instances de la classe, plutôt que d'être local pour chaque instance. En outre, une classe statique fonction en C++ ne peut accéder à des variables statiques de la classe (ou des classes, il a accès). Maintenant, en C++ const ne donnent membres de la liaison interne à l'unité de compilation, sauf s'ils sont explicitement déclarés extern - c'est peut-être à quoi vous faites allusion. Cela permet à des constantes de compilation partagée par l'ensemble de l'unité par le biais de l'utilisation de fichiers d'en-tête. Gardez à l'esprit, cependant, que les membres ne sont pas vraiment statique plutôt la constante est compilé dans chaque endroit où il est référencé.

6voto

Faisal Vali Points 10048

Dans C & C++ le terme statique a des significations multiples (il peut gouverner de liaison et de stockage) Vous aurez à lire de Stroustrup D&E pour apprécier sa justification - mais lorsque vous déclarez une variable const à portée espace de noms, il a automatiquement une liaison interne -, alors qu'en C, vous devez le déclarer statique pour le forcer à avoir une liaison interne.

Bien sûr, en C++, l'utilisation de l'électricité statique à des tringles de commande a été abandonné, anonyme espaces de noms peuvent être utilisés pour simuler une liaison interne en C++.

const variables en C++ étaient censés remplacer les constantes de préprocesseur - et depuis des constantes de préprocesseur ne sont visibles que dans des fichiers qui définissent eux, de la même façon, const fait automatiquement la variable visible uniquement dans le fichier qui la définit.

4voto

Klaim Points 24511

Ces concepts sont orthogonaux et ne doivent pas être considérés comme la même chose.

La constness est une propriété d'accès: elle indique uniquement si votre variable doit être en lecture seule (const) ou en lecture-lecture (non-const).

La staticité est une propriété de durée de vie (et techniquement de localisation en mémoire): elle indique si la variable sera globale dans le cadre d'une classe (lorsqu'elle est dans une classe) ou d'une unité de traduction (lorsqu'elle est utilisée avec une variable globale définie dans un cpp) .

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