2010-05-26 7 views
3

Contenu de X.c:multiples déclarations et définitions

int i; 
main() 
{ 
fun(); 
} 

Contenu de Y.c:

int i; 
fun() 
{ 
} 

Pourquoi ces deux fichiers de compilation sans erreur? (en utilisant GCC)

Mais si j'utilise int i = 10;, il imprime une erreur de définition multiple.

+0

duplication possible de [lien de variable globale par défaut c & C++, problème multiple de déclaration et de définition] (http://stackoverflow.com/questions/6371048/cc-default-global-variable-linkage-multiple-declaration-definition- probl) – legends2k

Répondre

-1

Parce qu'il existe une différence entre une déclaration et une définition. int i; ne fait rien de plus que d'introduire un nom. D'autre part, int i = 10; définit i, par conséquent, une place dans la mémoire doit être réservée pour stocker la valeur à laquelle elle correspond. Mais il est impossible pour le compilateur de savoir quelle valeur correspond à i car vous voulez associer deux emplacements mémoire avec le nom i. Ceci est basé sur l'hypothèse que vous liez ces fichiers entre eux, ce qui n'est pas tout à fait clair à partir de votre explication.

+5

Non, 'int i;' est aussi une définition. – paxdiablo

+0

En effet, j'ai mal interprété son exemple, je suis désolé. – Pieter

+0

Je suis confus, est-ce la définition? – Pointer

1

En supposant que vous voulez vraiment une variable indépendante appelé i dans chacun de ces deux fichiers, vous devez les préfixe avec static afin de leur donner internal linkage.

static int i = 10; 

Si vous voulez Je dois être la même variable dans les deux fichiers, de sorte que les changements dans l'un affectent l'autre, utilisez les réponses que vous étiez given 3 hours ago lorsque vous avez demandé une variante de la question. S'il doit être partagé, vous devez définir la variable à un endroit. Pour ce qui est de savoir pourquoi cela n'a pas provoqué d'erreur sans init, je pense que c'est parce que vous n'utilisiez pas la variable tant qu'elle n'avait pas besoin d'être initialisée et donc le compilateur l'a ignoré.

Questions connexes