3 votes

Comment la valeur de la variable globale change-t-elle dans mon code ?

J'ai de nouveau déclaré une variable globale après la fonction principale, mais elle affecte toujours la fonction principale. Je sais que le langage C permet de déclarer à nouveau une variable globale lorsque la première déclaration n'initialise pas la variable (cela ne fonctionnera pas en C++). Si j'assigne la valeur après la fonction principale, cela fonctionne toujours avec deux avertissements en c mais donne une erreur en c++.

J'ai débogué le code mais il n'atteint jamais la ligne int a=10; .

#include <stdio.h>
#include <string.h>

int a;

int main()
{
    printf("%d",a);
    return 0;
}
/*a=10  works fine with following warnings in c.
        warning: data definition has no type or storage class
        warning: type defaults to 'int' in declaration of 'a' [-Wimplicit-int]|

        but c++ gives the following error
        error: 'a' does not name a type|
*/
int a=10;

Le résultat est le suivant 10 .

6voto

John Bode Points 33046

Plusieurs choses :

  • Le premier int a; est une déclaration provisoire ; la deuxième int a = 10; est une déclaration de définition.

  • a est déclarée au niveau du fichier, elle aura donc la valeur static durée de stockage - cela signifie que le stockage sera mis de côté et initialisé au démarrage du programme (avant que le programme ne soit lancé). main s'exécute), même si la déclaration de définition intervient plus tard dans le code source.

  • Les anciennes versions de C permettent d'utiliser des int déclaration - si une variable ou un appel de fonction apparaît sans déclaration, on suppose qu'elle est de type int . Le C++ ne prend pas en charge les déclarations implicites, vous obtiendrez donc une erreur.

3voto

Achal Points 11272

Ici

int a; /* global declaration */

le compilateur traite la déclaration ci-dessus comme un simple déclaration pas de définition . Il recherche la définition de a dans d'autres unités de traduction, il trouve ci-dessous main() como

int a=10;

Par conséquent, la sortie 10 .

Pour éviter les avertissements, déclarez a con extern classe de stockage, par exemple

extern int a;

2voto

H.S. Points 5974

De la norme C#6.9.2p2

2 La déclaration d'un identificateur pour un objet ayant une portée de fichier sans initialisateur et sans spécificateur de classe de stockage ou avec le spécificateur de classe de stockage static, constitue une déclaration d'identificateur de classe de stockage. définition provisoire .....

Ainsi, cette

int a;

est une définition provisoire de l'identifiant a .

Quelques points concernant définition provisoire :

  • S'il n'y a pas de définition dans la même unité de traduction, la définition provisoire fait office de définition réelle avec l'initialisateur = 0 .
  • Si une définition externe réelle est trouvée plus tôt ou plus tard dans la même unité de traduction La définition provisoire joue alors le rôle d'une déclaration.

Dans votre programme, le compilateur a trouvé la définition de a dans la même unité de traduction :

int a=10;

Vous obtenez donc le résultat suivant 10 lors de la compilation avec le compilateur C.

Maintenant, en ce qui concerne l'erreur lors de la compilation avec le compilateur C++ :

Si vous avez cette déclaration dans votre programme :

a=10;

Cela entraînera une erreur lors de la compilation avec le compilateur C++, car il manque le spécificateur de type requis. Mais ce code sera compilé avec le compilateur C car, dans les anciennes versions de C (C89/90), si le spécificateur de type est manquant, il sera défini par défaut à int . Bien sûr, vous obtiendrez un message d'avertissement lors de la compilation avec le compilateur C99 & C11 car cette déclaration implicite n'est plus supportée.

Si vous avez cette déclaration dans votre programme :

int a=10;

Le C++ n'a pas de concept de définitions provisoires et int a; est une définition en C++. Par conséquent, en raison du concept de Règle de la définition unique le compilateur C++ donnera l'erreur - redefinition of 'a' .

0voto

Tout ce que je sais, c'est que le compilateur C++ d'aujourd'hui ne peut pas exécuter le code :

int a;
int main()
{
    printf("%d",a);
    return 0;
}
int a=10;

ni

int a;
int main()
{
    printf("%d",a);
    return 0;
}
a=10;

parce que c++ détecte la double déclaration de la variable.
et
car il ne peut pas initialiser une variable en dehors d'une méthode.

L'erreur "'a' does not name a type" est due à cette (deuxième) erreur, c++ s'attend à ce que le premier mot soit un type pour la déclaration (ex : int, long, char, -etc-), et la variable est donnée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X