27 votes

Pourquoi la définition multiple d'une variable globale const est-elle autorisée en C ++ et non en C?

Plusieurs définition d'une variable globale n'est pas autorisé en C ou C++ en raison de la Définition de la Règle. Toutefois, en C++ const variable globale peut être définie de plusieurs unités de compilation sans erreur. Ce n'est pas le même qu'en C.

Pourquoi est-ce que C++ permettre à cette tandis que le C ne l'est pas? Pourquoi l'utilisation et le comportement d'un const mondiale diffèrent d'un non-const global de cette façon en C++ par rapport au C? Ce qui se passe sous les couvertures avec C++ et C par rapport à const?

Par exemple, c'est permis en C++, mais mal dans C:

// Foo.cpp
const int Foo = 99;

// Main.cpp
const int Foo = 99;
int main()
{
    cout << Foo << endl;
    return 0;
}

Et ce qui est bien avec le C, mais de mal avec C++:

// Foo.cpp
const int Foo = 99;

// Main.cpp
extern const int Foo;
int main()
{
    cout << Foo << endl;
    return 0;
}

26voto

Nawaz Points 148870
// Foo.cpp
const int Foo = 99;

// Main.cpp
const int Foo = 99;

const variable à l'espace de noms de domaine interne de liaison. Ils sont donc fondamentalement deux variables différentes. Il n'y a pas de redéfinition.

À partir de @David commentaire, 3.5/3 [de base.lien]:

Un nom ayant portée espace de noms (3.3.5) a une liaison interne si c'est le nom de
- un objet, de référence, de la fonction ou modèle de fonction qui est explicitement déclarée statique ou,
- un objet ou référence est explicitement déclaré const et ni explicitement déclaré extern ni précédemment déclarée liaison externe; ou
- un membre de données d'un anonyme de l'union.


Dans le second cas, vous devriez le faire (de manière correcte):

//Foo.h
extern const int Foo; //use extern here to make it have external linkage!

// Foo.cpp
#include "Foo.h"
const int Foo = 99; //actual definition goes here

// Main.cpp
#include "Foo.h"
int main()
{
   cout << Foo << endl;
}

7voto

Charles Bailey Points 244082

Je pense que vous demander la raison et non pas la langue spécifique de la règle qui permet à ce.

La raison pour cela est qu'il rend const variables beaucoup plus facile à utiliser. Il donne une tapée de remplacement pour une utilisation commune de l' #define.

Au lieu de #define MAX_COUNT 211 vous pouvez utiliser const int max_count = 211; exactement de la même manière, par exemple, un partage fichier d'en-tête, sans avoir à vous soucier de l'endroit où mettre une définition.

Vous ne pouvez pas légalement modifier la valeur d'un const objet donc il n'y a pas de différence visible entre un objet et de plusieurs objets avec la même valeur.

Comme vous pouvez le mettre une définition de l' const objet dans un fichier d'en-tête, il fait trivial pour le compilateur à utiliser directement la valeur à la phase de compilation sans ces optimisations avoir à être retardée pour un lien-temps de correction.

5voto

Puppy Points 90818

Fondamentalement, en C++, const, non les variables locales sont de véritables expressions constantes, ou constexpr. Cela permet beaucoup de choses, comme la TMP.

const int five = 5;
int main() {
    int x[five];
    std::array<int, five> arr;
}

En C, ils sont juste une variable qui ne peut pas être modifié. Qui est,

const int five = 5;
int main() {
    int x[five]; // Technically, this is a variable length array
}

Est tout à fait équivalent à

int five = 5;
int main() {
    int x[five];
}

Effectivement, C++ favorise certains types d' const variable à une nouvelle catégorie, constexpr, alors qu'en C, cela n'existe pas et ils sont juste des variables qui se trouvent être inmodifiable.

3voto

Alex B Points 34304

0voto

Neil Points 1235

Pourquoi les Anglais épellent-ils COLOR, alors que les Américains l'épellent COLOR?

Ce sont 2 langues différentes de la même base, mais elles n'ont pas les mêmes règles.

C & C ++ sont les mêmes. S'ils n'étaient pas différents, ils s'appelleraient tous les deux la même chose.

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