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 :

Mettre une valeur par défaut dans le fichier d'en-tête ?


Sujet :

C++

  1. #1
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut Mettre une valeur par défaut dans le fichier d'en-tête ?
    Salut les C++,

    J'ai le problème suivant avec les paramètres par défaut dans les fichiers d'en tête que ce soit pour les fonctions ou pour les classes:

    Je définis un fichier *.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    #include "my_func.h"
     
    void my_func(const std::string my_string, bool pb=false) {
     
      return ;
     
    }
    Puis un fichier d'en tête correspondant *.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifdef __PB_DEFAULT_HH__
    #define __PB_DEFAULT_HH__
     
    #include <string>
     
    extern void my_func(const std::string my_string, bool pb) ;
     
    #endif
    Et écrit comme cela la compilation fonctionne parfaitement, seulement je ne peut pas appeler ma fonction comme ceçi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    #include "my_func.h"
     
    int main(int argc, char *argv[]) {
     
      my_func("my_string") ; 
     
      return 0 ;
     
    }
    Le compilateur se plaint qu'il manque un argument a l'appel de la fonction my_func(...) ???

    Et c'est la même chose concernant les classes et leur constructeur(s).

    Et je ne comprends pas pourquoi ???

    ---

    Alors que si je fait ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifdef  __PB_DEFAULT_HH__
    #define __PB_DEFAULT_HH__
     
    #include <string>
     
    void my_func(const std::string my_string, bool pb=false) {
     
      return ;
     
    }
     
    #endif
    et que j'inclus le fichier dans main et bien je peut appeler la fonction my_func(...) comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    #include "my_func.h"
     
    int main(int argc, char *argv[]) {
     
      my_func("my_string") ; 
     
      return 0 ;
     
    }
    Sans problème nie a la compilation nie a l'appel de la fonction...

    Merci pour vos réponses éclairées et votre aide précieuse.

    PS: connaissez vous l'extension *.inl car je l'ai rencontrer dans la glm qui par d'ailleurs n'a pas besoin d'être linker (le fichier *.so n'existe pas) ?
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    C'est parce que le paramètre par défaut n'est pas indiqué dans l'en-tête.
    Du coup, le main.cpp qui l'inclue contient donc extern void my_func(const std::string my_string, bool pb) ;, ce qui n'est pas une signature valable pour my_func("Bidule");.


    La raison profonde, c'est le fonctionnement de la compilation.
    En C++, la compilation est faite par unité de compilation, chacune indépendamment.
    Une telle unité est définie comme le résultat du passage du préprocesseur sur un seul fichier .cpp

    Une unité ne connait que ce qu'elle contient, c'est à dire le contenu préprocessé du .cpp, donc, récursivement, celui de chaque fichier inclus, à l'emplacement où il est inclus.

    Dans ton cas, l'unité contenant main est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //contenu de <string>
     
    extern void my_func(const std::string my_string, bool pb) ;
     
    int main(int argc, char *argv[]) {
     
      my_func("my_string") ; 
     
      return 0 ;
    }
    Lors de la compilation de ce .cpp déjà préprocessé, my_func ne contient pas d'argument par défaut pour pb, donc une valeur doit être fournie.

    Cela éclaire le rôle du mot clé extern (qui est automatiquement appliqué à un prototype de fonction): il permet de déclarer un symbole externe, c'est à dire défini dans une autre unité de compilation.
    à la compilation proprement dit, cela signifie accepter aveuglément son existence.

    La définition sera trouvé lors de la phase suivante: l'édition de liens, qui sert justement à rassembler les différentes unités de compilations en un seul programme (ou une bibliothèque)

    Pour information, les compilateurs peuvent être utilisés pour ne produire que l'unité préprocessée. Avec gcc, c'est l'option -E.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #ifdef __PB_DEFAULT_HH__


    Si un paramètre prend une valeur par défaut, il faut l'indiquer dans le prototype. Qu'il soit extern ou non.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    La réponse courte, c'est que tu as mis ton =false du mauvais côté.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Merci pigé pour les unités séparées

    mais mon compilateur ne veut pas compiler des en-têtes,

    qui ont des paramètres par défaut lors de la compilation séparé...

    Alors y a t il un moyen de remédier a cela ?
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu as un exemple minimal, avec les rapports d'erreurs?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Un en-tête ne se compile pas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Ouf récrit tout les en-têtes et tête de fonctions dans les fichiers *.cpp.

    Le problème est résolus: il faut mettre la définition des valeurs de paramètres par défaut dans les fichier d'en-têtes.

    Un cas de problème d'école.

    Merci a tous d'avoir éclairé ma lanterne.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Oui parce que comme on l'a indiqué plus haut : la valeur par défaut d'un paramètre fait partie du prototype, que doit fournir un en-tête.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/09/2009, 14h43
  2. Mettre une valeur par défaut dans un input type='file'
    Par fab76000 dans le forum Langage
    Réponses: 2
    Dernier message: 27/01/2009, 19h59
  3. Réponses: 10
    Dernier message: 04/11/2008, 14h30
  4. Réponses: 4
    Dernier message: 05/06/2007, 09h16
  5. Réponses: 6
    Dernier message: 14/02/2006, 20h53

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