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 :

G++ est les variables non reconnues


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut G++ est les variables non reconnues
    Bonsoir
    J'ai un petit soucis de débutant avec g++.
    Etant donné les quatre fichiers suivants:

    1 - Fichier: a.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef a_hpp
    #define a_hpp
     
    namespace foo
    {
        void a();}
     
    #endif
    2 - Fichier: a.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "a.hpp"
    #include <iostream>
     
    namespace foo
    {
        static const m = 100;
        void a()
        {
            std::cout << m << std::endl;
        }
    }
    3 - Fichier: b.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifndef b_hpp
    #define b_hpp
     
    namespace foo
    {
        void b();
    }
     
    #endif
    4 - Fichier: b.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "a.hpp"
    #include "b.hpp"
    #include <iostream>
     
    namespace foo
    {
        void b()
        {
            std::cout << m << std::endl;
        }
    }
    La commande g++ -c a.cpp génère un a.o (parfait).
    Par contre quand je lance la commande g++ -c b.cpp le compilateur ne reconnait pas la variable m.
    De ce fait ma question est double:
    1. pourquoi m n'est pas reconnue ?
    2. quelle commande g++ lancer pour pouvoir générer un b.o étant donné les fichiers précédent (sans changer le code) ?


    Merci d'avance

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    La compilation échoue parce que le code est vérolé :

    Il faut virer le static de static const m = 100;, sinon m ne sera accessible que depuis a.cpp. Au passage, il vaudrait mieux préciser un type pour m, même si des compilos peu scrupuleux en permettent visiblement l'omission et collent implicitement un type int :
    Il faut déclarer m en extern dans a.hpp, pour que tous les fichiers incluant a.hpp sachent que m existe, même s'il est défini ailleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    namespace foo
    {
    extern const int m;
    void a();
    }

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    La raison pour laquelle m n'est pas connue dans b.cpp, c'est qu'elle n'est déclarée dans aucun en-tête importé, ni dans le corps de b.cpp.

    Les corrections proposées par cob59 sont effectivement celles qui s'imposent.

    Tu veux utiliser une variable globale m. Pour cela, il faut:
    extern const int m; dans a.hpp pour avoir une variable globale déclarée.
    const int m = 100; dans a.cpp pour définir m.
    Je rappelle au passage qu'une entité ne peut avoir qu'une et une seule définition. Le mot clé static (hors d'une classe) permet d'annoncer au compileur "cette entité est définie pour l'unité de compilation courante uniquement, elle est différente de celles portant le même nom dans d'autres unités."

    Par ailleurs, on ne parle pas de vérolé pour un code source erroné, ou parle d'erreur ou de bug...

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos réponses rapides !
    Tout fonctionne correctement et je capitalise en connaissances

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Option pour voir les variable non utilisées ?
    Par lex13 dans le forum NetBeans
    Réponses: 13
    Dernier message: 25/08/2007, 12h57
  2. [Tableaux] Variable non reconnue
    Par oceane751 dans le forum Langage
    Réponses: 31
    Dernier message: 05/01/2007, 23h22
  3. variable non reconnue dans une requête sql
    Par sanatou dans le forum C++
    Réponses: 3
    Dernier message: 13/12/2006, 17h43
  4. variable non reconnue
    Par shnouf dans le forum Langage
    Réponses: 7
    Dernier message: 13/02/2006, 16h44
  5. variables non reconnues
    Par syscom14 dans le forum Langage
    Réponses: 6
    Dernier message: 11/10/2005, 18h37

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