Définition de variables globales à l’aide d’un initialiseur non constant

#include  int i=10; int j=i; int main() { printf("%d",j); } 

Je reçois une erreur indiquant que l’élément d’initialisation n’est pas une constante? Quelle est la raison derrière cela?

Quelle est la raison derrière cela?

C (contrairement à C ++) ne permet pas l’initialisation de valeurs globales avec des valeurs non constantes.

Norme C99: Section 6.7.8:

Toutes les expressions dans un initialiseur pour un object ayant une durée de stockage statique doivent être des expressions constantes ou des littéraux de chaîne.

Vous pouvez essayer d’utiliser:

 int i=10; int j=0; int main() { j=i;//This should be the first statement in the main() and you achieve the same functionality as ur code return 0; } 

La seule vraie méthode en C consiste à l’initialiser au moment de l’exécution. Bien qu’en C ++, votre code fonctionne correctement, sans erreur de compilation.

La norme C interdit clairement l’initialisation d’objects globaux avec des valeurs non constantes. La Section 6.7.8 de la norme C99 dit:

Toutes les expressions dans un initialiseur pour un object ayant une durée de stockage statique doivent être des expressions constantes ou des littéraux de chaîne.

La définition d’un object avec static storage duration est décrite à la section 6.2.4:

Un object dont l’identificateur est déclaré avec une liaison externe ou interne ou avec le spécificateur de classe de stockage static a une durée de stockage statique. Sa durée de vie correspond à l’exécution complète du programme et sa valeur enregistrée n’est initialisée qu’une seule fois, avant le démarrage du programme.

L’idée derrière cette exigence est d’avoir tous les objects de durée de stockage statique initialisés au moment de la compilation. Le compilateur prépare toutes les données statiques sous une forme pré-initialisée, de sorte qu’il ne nécessite aucun code d’initialisation supplémentaire au moment de l’exécution. Par exemple, lorsque le programme compilé est chargé, toutes ces variables commencent leur vie dans un état déjà initialisé.

Dans la première version normalisée du langage C (C89 / 90), cette exigence s’appliquait également aux initialiseurs agrégés, même lorsqu’ils étaient utilisés avec des variables locales.

 void foo(void) { int a = 5; struct S { int x, y; } s = { a, a }; /* ERROR: initializer not constant */ } 

Apparemment, la raison de cette ressortingction était que les initialiseurs agrégés étaient supposés être construits à l’avance dans le segment de données pré-initialisé, tout comme les variables globales.

Utilisez ceci:-

 int i=10,j=1; int main() { printf("%d",j); } 

Bien que ce soit un changement mineur, mais cela fonctionnera