Pourquoi ne puis-je pas affecter de valeurs à des variables globales en dehors d’une fonction en C?

Supposons que j’ai une variable globale et que je veuille lui affecter une autre variable. J’ai découvert que vous pouvez affecter une autre valeur à une variable globale dans une fonction:

int i = 8; int main(void) { i = 9; /* Modifies i */ return 0; } 

Cependant, l’affectation de la variable globale en dehors d’une fonction ne fonctionne pas!

 int i = 8; i = 9; /* Comstackr error */ int main(void) { return 0; } 

Je reçois le message d’erreur suivant:

 warning: data definition has no type or storage class warning: type defaults to 'int' in declaration of 'i' error: redefinition of 'i' note: previous definition of 'i' was here int i = 8; ^ 

Pourquoi cela arrive-t-il?

Ceci est une définition d’une variable globale, avec l’initialisation optionnelle sur une valeur spécifique:

 int i = 8; 

Notez que ce n’est pas le code qui est exécuté, la variable sera simplement configurée pour contenir initialement le 8. Soit le considérer comme “magique” (un modèle utile pour beaucoup de choses qui ne sont pas vraiment définies par la norme) ou penser aux tableaux avec des valeurs en cours de copie dans des emplacements de mémoire avant l’exécution de tout code.

C’est un morceau de code qui n’a pas de “cadre” dans lequel il est exécuté.
(Ou vous avez l’intention de le faire. Le compilateur est d’un autre avis, voir ci-dessous.)

 i = 9; 

Il n’y a pas de fonction le contenant. Il n’est pas clair quand il devrait être exécuté. C’est ce que le compilateur n’aime pas.
En C, tout le code doit être à l’intérieur d’une fonction et ne sera exécuté que si cette fonction est appelée, par exemple depuis main() .

D’autres langages, principalement ceux qui exécutent des “scripts” en les interprétant (au lieu que le code soit transformé en exécutables, par exemple par un compilateur) permettent d’avoir du code n’importe où. C est différent.

Le compilateur voit cela différemment:

 i = 9; 
  • ce n’est pas dans une fonction, donc ça ne peut pas être du code
  • il ressemble à une définition de variable, en supposant que vous voulez dire que ce soit un int , c’est-à-dire la valeur par défaut
  • mais s’appuyer sur les valeurs par défaut n’est pas une bonne idée, aussi avertissez-vous du type manquant et que la valeur par défaut est utilisée
  • aussi, si c’est une définition, alors c’est la deuxième pour i , maintenant c’est vraiment faux, alors montrez une erreur et échouez à la compilation
  • juste pour être utile, mentionner où se trouve la première définition de i

Voici comment lire le résultat du compilateur que vous avez cité.