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

Langage C++ Discussion :

Namespace et bibliotheque


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Namespace et bibliotheque
    Bonjour.

    Dans un projet, on m'oblige à utiliser une bibliothèque propriétaire très mal codée : elle n'est pas dans un namespace, je n'ai pas accès au code, les fonctions sont très buggée...

    Je fait avec et je recode les fonctions buggées, mais j'ai des collisions de noms avec certaines de mes fonctions.
    La solution simple mais crade est de renommer mes fonctions pour éviter ces collisions, et adapter tous les appels.
    J'aurai préféré rajouter un namespace à la bibliothèque.
    J'ai tenté d'entourer l'include dans un nouveau namespace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace libDuMal {
    #include <libToutePourie.h>
    };
     
    namespace monNamespaceAMoi {
    void func_a_jeter_a_la_poubelle() {
        libDuMal::func_a_jeter_a_la_poubelle();
    };
    Évidemment ça ne marche pas : je me retrouve avec des undefined...

    Auriez vous une idée ?
    Merci d'avance.

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour

    Tu peux encapsuler la lib dans un design pattern wrapper :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // .h
    class LibToutePourieWrapper { // ou namespace
        void foo1();
        void foo2();
    };
     
    // .cpp
    #include <libToutePourie.h>
     
    LibToutePourieWrapper::foo1() {
        func_a_jeter_a_la_poubelle1();
    }
     
    LibToutePourieWrapper::foo2() {
        func_a_jeter_a_la_poubelle2();
    }
    Comme ça, tu peux :
    * isoler complètement les appels de la lib
    * facilement réimplémenter une fonction qui bug
    * ajouter des pré et post conditions dans tes fonctions pour protéger les appels de la lib

  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
    Bonjour,

    essaye avec un using namespace libDuMal; au niveau de l'inclusion de la lib en question.
    Peut-être que certains appels en interne de la lib en ont besoin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    namespace libDuMal {
    using namespace libDuMal;
    #include <libToutePourie.h>
    };
    Peut-on avoir l'erreur exacte ?
    S'il s'agit de undefined reference, vérifier les .a/.lib liés à la compilation.
    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
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Tout d'abord, merci de vos réponses.

    @Bousk: c'est bien des erreurs "undefined reference".
    Ma lib est bien linké, car si je ne met pas le "#include" entre namespace, tout fonctionne (enfin si je met pas mes redéfinitions...)
    Le coup du "using namespace libDuMal;" ne change absolument rien.


    @gbdivers: ton idée est intéressante, mais elle m'oblige à changer tous les appels, et de redéfinir toute les fonctions de la lib.
    Autant dire que c'est un travail titanesque.
    Enfin peut être pas en remplaçant le classWrapper par un namespaceWrapper et en utilisant le "using namespaceWrapper;".
    Je vais tester.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Ça a l'air de fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    // LibToutePourieWrapper.h
    namespace LibToutePourieWrapper {
        void func_a_jeter_a_la_poubelle1();
        void func_a_jeter_a_la_poubelle2();
    };
     
    // LibToutePourieWrapper.cpp
    #include <libToutePourie.h>
     
    LibToutePourieWrapper::func_a_jeter_a_la_poubelle1() {
        func_a_jeter_a_la_poubelle1();
    }
     
    LibToutePourieWrapper::func_a_jeter_a_la_poubelle2() {
        func_a_jeter_a_la_poubelle2();
    }
     
    // Utilisation.cpp
    #include "LibToutePourieWrapper.h"
     
    using namespace LibToutePourieWrapper;
     
    func_a_jeter_a_la_poubelle1();
    Donc j'ai juste à changer les includes dans tout mon projet, et a redefinir les methodes buggée dans mon wrapper.
    Merci beaucoup.

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Idéalement, c'est vrai que il aurait fallut encapsuler dès le départ.
    Mais oui, tu peux simplement créer ton namespace et garder les mêmes noms de fonctions. Mais attention : ne mélange surtout pas l'appel directe à la lib et l'appel en passant par le wrapper, sinon ça sera ingérable rapidement. Donc 1 seul include de ta lib : dans le cpp du wrapper et c'est tout (fait une recherche multifichier pour vérifier que tu n'as pas d'autres include qui trainent

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Oui, logique tout doit passé par le wrapper, pour être sur que c'est les fonctions modifiée qui sont exécutées. Enfin ça reste dommage de pas pouvoir encapsuler une lib qu'on ne maitrise pas...
    Peut être dans la prochaine norme

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

Discussions similaires

  1. bibliotheque statique & namespaces !
    Par Qt forever dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 05/06/2011, 20h40
  2. bibliotheques graphiques et devc++
    Par bellepatte dans le forum C
    Réponses: 2
    Dernier message: 18/10/2003, 13h32
  3. [Debutant][Divers] - namespace et attributs
    Par sebbb dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 14h40
  4. Erreur récurrente (namespace)
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 3
    Dernier message: 25/02/2003, 10h27
  5. [Kylix] bibliotheque libtwin32.so
    Par mic006 dans le forum EDI
    Réponses: 1
    Dernier message: 08/05/2002, 01h36

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