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
Enregistrer un commentaire