Comment bien définir les variables externes ?

Dans le programme

case0.c

int main()
{
int x;
x = 4;
}

x est d'abord déclaré comme int, et la mémoire est allouée pour x sur la ligne suivante. Pas de problèmes ici.

Cependant, si j'écris les fichiers (dans le cadre d'un programme plus important)

case1.c

extern int x; 
x = 4;

Je reçois, de gcc, warning: data definition has no type or storage class. De même, si je fais

case2.c

extern int x = 4;

gcc n'aime pas non plus et donnewarning: 'x' initialized and declared 'extern'

Le seul cas qui ne génère aucun avertissement est

case3.c

extern int x;
int x = 4;

Pourquoi le cas 1 donne-t-il une erreur, alors que le cas 0 ne le fait pas ? Le cas 3 est-il le seul et unique moyen de définir des variables externes ?


Solution du problème

x est d'abord déclaré comme int, et la mémoire est allouée pour x sur la ligne suivante. Pas de problèmes ici.

Non, ce n'est pas ce qui se passe. A l'intérieur d'une fonction, int x;définit x, qui lui réserve de la mémoire. Stocke ensuite x = 4;une valeur dans cette mémoire.

extern int x; x = 4;

extern int x;déclare qu'il y a un xmais ne le définit pas. Si le programme utilise this x, il devrait le définir ailleurs.

En dehors d'une fonction, seules les déclarations doivent apparaître. Cependant, x = 4;est une déclaration, donc ce n'est pas approprié en dehors d'une fonction.

extern int x = 4;

C'est du C valide, mais c'est une utilisation non conventionnelle, donc le compilateur vous avertit. Classiquement, on écrit int x = 4;pour définir et initialiser x, et on écrit extern int x;pour déclarer xsans le définir.

extern int x = 4;est défini par la norme ; dans ce contexte, c'est effectivement la même chose que int x = 4;. Mais les programmeurs n'utilisent généralement pas cette forme.

(S'il existe une déclaration antérieure visible de x, telle que static int x;, alors extern int x = 4;diffère de int x = 4;. extern int x = 4;fera référence à la xde la déclaration précédente, tandis que int x = 4;tentera de créer un nouveau x.)

extern int x; int x = 4;

extern int x;déclare xmais ne le définit pas.

int x = 4;le définit xet l'initialise.

Le cas 3 est-il le seul et unique moyen de définir des variables externes ?

Si vous n'avez besoin d'utiliser que xdans une seule unité de traduction, vous pouvez l'utiliser int x = 4;seul, sans extern int x;. Si vous devez utiliser xdans plusieurs unités de traduction, vous devez placer extern int x;un fichier d'en-tête et inclure ce fichier d'en-tête dans chaque fichier source qui utilise x, y compris celui qui le définit.

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"