IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Redéfinition de variables


Sujet :

C

Vue hybride

Bktero Redéfinition de variables 02/05/2012, 12h20
Neckara Le compilateur fait parfois... 02/05/2012, 12h54
Bktero C'est une hypothèse plutôt... 02/05/2012, 14h10
Neckara Hors du main et des... 02/05/2012, 14h50
Bktero Tu te défens bien en bonnes... 02/05/2012, 15h05
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut Redéfinition de variables
    Bonjour,

    En lisant compilant un code lu sur ce forum, j'ai été étonné que le code suivant compile sans erreur ni warning, et que la sortie en console soit correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
     
    int a;
    int a;
     
    int main(void)
    {
        a = 10;
        printf("a = %d", a);
        return 0;
    }


    Celui-ci non plus ne pose pas de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
     
    int a;
    int a=1;
     
    int main(void)
    {
        printf("a = %d", a);
        return 0;
    }


    En revanche, celui-ci produit des erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
     
    int a=1;
    int a=1;
     
    int main(void)
    {
        int b;
        int b; // ici, je m'y attendais
        printf("a = %d", a);
        return 0;
    }
    Sortie de compilation :
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\test.c|4|error: redefinition of 'a'|
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\test.c|3|note: previous definition of 'a' was here|
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\test.c||In function 'main'
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\test.c|9|error: redeclaration of 'b' with no linkage|
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\test.c|8|note: previous declaration of 'b' was here|
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\test.c|9|warning: unused variable 'b'|
    ||=== Build finished: 2 errors, 1 warnings ===|


    Pourquoi est-ce que je n'ai pas d'erreur pour les variables globales avec les 2 premiers codes ? Je précise que je compile avec CodeBlocks sous XP avec -Wall et -Wextra.

    Merci !

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Le compilateur fait parfois quelques optimisations.

    Je pense que lorsqu'on manipule des variables globales, il considère que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int a; int a; //revient à faire uniquement int a; car le 2ème a écrase le 1er a
    int a;int a=1; //revient à faire uniquement int a=1; idem
    int a=1; int a=1; //ne va pas car on va perdre une information si le 2ème a écrase le premier, on perd la valeur contenue dans a
    De toute façon, la question ne devrait pas se poser : on ne fait pas de variables globales et voila

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    C'est une hypothèse plutôt bonne, mais pourquoi ne pas faire la même chose sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        int b;
        int b; // ici, je m'y attendais
    dans le main() ?

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Hors du main et des fonctions, le compilateur choisit l'ordre "d'exécution" ou plutôt d'initialisation des variables.

    Dans le main et les fonctions, c'est plus compliqué, on peut faire des sauts (goto, siglongjmp), un signal peut se produire etc...

    Donc s'il a deux lignes "int a", s'il veut optimiser et n'en mettre qu'une seule, où mettre le "int a" ? A la ligne du premier "int a" ou à la ligne du deuxième "int a"?
    Sachant que ceci pourra avoir une incidence sur le code final.


    Après ce n'est qu'une hypothèse.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Tu te défens bien en bonnes hypothèses, tu sais

  6. #6
    Membre émérite
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 511
    Par défaut
    Bonjour à tous

    D'après ce que je vois au chapitre 6.5 de la norme C Ansi.

    All declarations in the same scope that refer to the same object or function shall specify compatible types.
    j'en déduis que vous pouvez déclarer plusieurs fois le même objet si il est de type compatible, donc le premier est correct. Mais cela ne ne colle pas avec les autres cas.
    Page sur Developpez : http://pbriand.developpez.com

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/09/2010, 12h20
  2. redéfinition de variable d'instance
    Par swinger45 dans le forum Langage
    Réponses: 8
    Dernier message: 27/09/2006, 18h34
  3. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo