Question

Par exemple:

code1.c / .cpp

int a;

// ... and so on

code2.c / .cpp

int a;

int main(void) {
    return 0;
}

Allez à Compiler:

$gcc code1.c code2.c      # this is fine
$

$g++ code1.cpp code2.cpp  # this is dead
/tmp/ccLY66HQ.o:(.bss+0x0): multiple definition of `a'
/tmp/ccnIOmPC.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status

Existe-t-il une différence de liaison variable globale entre C&C ++?

Était-ce utile?

La solution

Ce n'est pas strictement légal. int a; est une définition provisoire dans C. Vous êtes autorisé à plusieurs définitions provisoires et tout au plus une définition non tensive par unité de traduction de chaque objet avec un lien externe en C, mais une seule définition sur toutes les unités de traduction d'un programme.

Il s'agit d'une extension couramment implémentée pour permettre des définitions provisoires sur plusieurs unités de traduction en C tant que pas plus d'une unité de traduction ne contient une définition non tensive, mais elle n'est pas strictement standard.

En C ++ int a; est juste une définition - il n'y a pas de concept de provisoire - et il est toujours illégal d'avoir plusieurs définitions d'un objet à travers les unités de traduction d'un programme.

Pour le cas C, vous voudrez peut-être regarder cette question.

Autres conseils

Il est illégal dans les deux, mais les compilateurs C implémentent généralement une extension. Voir Cette réponse.

Il existe trois façons de résoudre le problème:

  1. Si variable a est le même dans les deux fichiers, vous devez le déclarer comme extern dans tous les fichiers sauf un. extern Le mot-clé indique à Linker que ce nom est situé dans un autre fichier.

  2. Vous pouvez utiliser static mot-clé pour limiter la portée de la variable à un fichier. Dans lequel il est déclaré.

  3. Ou vous pouvez utiliser l'espace de noms sans nom.

Le compilateur G ++ est plus strict que le compilateur GCC. Cela dépend également de la version de GCC, peut être une version plus élevée de GCC IE 4.x à la fin, il peut donner la même erreur.

Utilisation extern éviter

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