Question

J'ai lu quelques réponses sur ce sujet, mais je ne suis toujours pas sûr :

En C++, une définition de variable const globale est automatiquement static.Cependant, je peux y accéder depuis un autre fichier cpp via extern :

// module.cpp

const int i = 0;

et

// main.cpp

extern const int i;

int main ()
{
    if (i > 10)
        return 0;
    else
        return 1;
}

Pourquoi est-ce possible (accéder à un objet avec lien interne depuis un autre module) ?Normalement, je devrais être obligé de définir i comme extern const int i = 0 dans module.cpp, pour avoir un explicite const globale mais non statique, ou?

En comparaison, ce n'est pas possible :

// module.cpp

static int i = 0;

et

// main.cpp

extern int i;

int main ()
{
    i = 10; // but read-only access like (i > 10) would be possible!
    return 0;
}

La réponse est donc la suivante :oui, vous pouvez accéder aux objets liés internes depuis d'autres modules, mais uniquement en lecture (donc toujours avec const) ?

Modifier:

Désolé, mais j'ai fait une erreur :dans mon code original, je viens d'essayer une expression sans effet (dans les deux exemples) :

extern const int i; // or extern int i for second example
int main ()
{
    i>10;
    return 0;
}

Je pensais qu'il se comportait de la même manière, comme si le déroulement du programme ou les données dépendaient de cette expression, mais en fait ce n'est pas le cas !Le compilateur semble simplement supprimer cette expression inutile, afin que l'éditeur de liens ne la voie pas !Donc tout va bien :dans le premier exemple i il faut bien définir extern const int i = 0 dans module.cpp, et dans le deuxième exemple i impossible d'y accéder du tout (sauf dans une expression sans effet).Le compilateur est VC++2010.

Edit2 :

Cependant, maintenant je ne comprends pas pourquoi cela est possible :

// module.cpp

extern const int i = 0;

et

// main.cpp

int i = 99;

int main ()
{
    bool b = i>10;
    return 0;
}

i avoir à la fois un lien externe.Mais aucune erreur.Quand dans module.cpp je définis int i = 0, puis erreur (plusieurs symboles).Pourquoi?

Était-ce utile?

La solution

Pour moi, cela ressemble à un bug du compilateur.La variable constante i n'est pas définie. Elle est uniquement déclarée dans main.cpp.Quant à la variable i dans module.cpp, elle a un lien interne et ne doit pas être accessible en dehors du module.

Par rapport à votre ajout au message d'origine, le compilateur n'a rien de commun avec cette situation.C'est l'éditeur de liens qui vérifie s'il existe des symboles externes en double.Je pense qu'il a décidé que si une variable a le qualificatif const et que l'autre n'en a pas, alors il y a deux variables différentes.Je pense que c'est l'implémentation qui définit si l'éditeur de liens émettra une erreur ou non.De plus, il peut disposer de certaines options permettant de contrôler le comportement de l'éditeur de liens dans de telles situations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top