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 :

duplication de définition


Sujet :

C++

  1. #1
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut duplication de définition
    Bonjour,
    j'utilise deux bibliothèques static qui definisse chacune des "objets" de même nom. A savoir une classe TOTO pour la bibliothèque A et une enum TOTO pour la bibliothèque B. Cela me pose problème à la compile. Comme on est en C++ y a les espaces de nomages pour gérer ce genre de problème, le problème c'est que je n'ai pas la main sur ces deux bibliothèque et que leurs développeur on omis d'y définir des espaces de nomages.
    Pour l'instant je gérai la chose en séparant l'utilisation de l'une et de l'autre dans des fichiers séparés.
    Mais là, j'ai un cas ou je suis obligé d'utiliser les deux bibliothèques dans une seul fichier.
    Je vois bien deux solutions pour éviter cela mais elle ne me plaisent pas:
    1) Modifier mon design, créer un sorte d'objet tampon qui ne sert à rien sauf de résoudre le problème.

    2) Séparer le code de mon objet dans deux fichiers un qui inclut la lib A et ne definissant que les methodes utilisant A et l'autre fichier la même chose avec la lib B. Mais cela viole les règles de dev de ma boite et apporte de la confusion -> difficulté à la première approche pour ceux qui passeront après moi. En plus les deux fichier aboutiront à un même .o donc je ne suis pas sur que ça marche.

    Avez vous d'autres solutions à me proposer ?

  2. #2
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Salut,

    je ne vois pas d'autre solutions que celles que tu as ennoncé sauf peut etre changer de librairie pour en utiliser une mieux codée avec des espaces de nommages ou des noms moins generiques.

    peux tu redefinir le enum TOTO dans tes propres fichier plutot que d'inclure celui de ta librairie ?

  3. #3
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    Citation Envoyé par xxiemeciel
    peux tu redefinir le enum TOTO dans tes propres fichier plutot que d'inclure celui de ta librairie ?
    Ben je n'utilise pas que l'enum dans la lib j'utilise aussi des fonctions, donc pas possible.

    Merci d'avoir pris le temps de me répondre tout de même.

  4. #4
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Peut-être une idée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define TOTO TOTO_A
    #include "A.h"
    #undef TOTO
    #define TOTO TOTO_B
    #include "B.h"
    #undef TOTO
     
    ...
     
    TOTO_A * Toto = new TOTO_A();

  5. #5
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    ca pourrait etre une solution mais je ne crois pas qu'il soit possible de faire un #undef sur quelquechose qui n'a pas ete definie par #define.

    et une classe et un enum ne sont pas defini par #define

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    En créent des enveloppes proxy qui changent les noms peut-être.

    Sinon, contacter ceux qui te fournissent ces bibliothèques et leur expliquer gentillement que finalement tu ne pairas pas la licence car leur produit est inutilisable avec l'autre produit. Et que donc tu passes à la concurrence.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    Citation Envoyé par Luc Hermitte
    Sinon, contacter ceux qui te fournissent ces bibliothèques et leur expliquer gentillement que finalement tu ne pairas pas la licence car leur produit est inutilisable avec l'autre produit. Et que donc tu passes à la concurrence.
    Se serait bien, mais je peut ni pour l'une ni pour l'autre. Pour cause de monopole totale. Ils sont les seuls à faire ce qu'il font et même si je voulais tout redévelopper à la main il ne me donneront jamais les spécifications necessaire pour le faire.
    Pour le proxy c'est ce que je voulait dire dans ma solution deux. Mais je trouve ça casse pied à faire et encore plus à maintenir. Car dès que l'une ou l'autre des bibliothèques va évoluer il faudra faire évoluer ma classe proxy.

  8. #8
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Citation Envoyé par xxiemeciel
    une classe et un enum ne sont pas defini par #define
    Bien sûr, et je n'ai jamais dit une chose pareille. Ce que mon code faisait, c'est juste remplacer le nom de l'ENUM (par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define TOTO TOTO_B
    enum TOTO {Val1, Val2, Val3};
    #undef TOTO
    est équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum TOTO_B {Val1, Val2, Val3};
    Et c'est le but recherché (ne plus avoir de conflit avec ce garnement de TOTO)

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par 10_GOTO_10
    Bien sûr, et je n'ai jamais dit une chose pareille. Ce que mon code faisait, c'est juste remplacer le nom de l'ENUM (par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define TOTO TOTO_B
    enum TOTO {Val1, Val2, Val3};
    #undef TOTO
    est équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum TOTO_B {Val1, Val2, Val3};
    Et c'est le but recherché (ne plus avoir de conflit avec ce garnement de TOTO)
    Le probleme c'est que la bibliotheque a des fonctions compilees utilisant TOTO et le mangling encode ce fait. Donc risque important d'avoir des problemes au link.

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Déjà, des bibliothèques qui utilisent des noms comme TOTO, ça fait pas sérieux

    A mon avis la meilleure méthode reste le bug report. Après tout, c'est pour ce genre de choses qu'on paye une maintenance.

    Une solution hyper crade, qui me force à dire "Bien entendu, au cas où vous seriez tué ou capturé, nous nierons avoir eu connaissance de vos agissements.", mais qui a déjà servi dans un cas similaire au frère d'un ami d'une connaissance lointaine, consiste à modifier tes .h pour remplacer TOTO par un autre mot ayant autant de lettres, puis à faire de même en binaire au niveau de tes bibliothèques. Il suffit alors d'égorger quelques poulets noirs et de brûler un cierge, et il se peut que ça marche.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    Citation Envoyé par JolyLoic
    Une solution hyper crade, qui me force à dire "Bien entendu, au cas où vous seriez tué ou capturé, nous nierons avoir eu connaissance de vos agissements.", mais qui a déjà servi dans un cas similaire au frère d'un ami d'une connaissance lointaine, consiste à modifier tes .h pour remplacer TOTO par un autre mot ayant autant de lettres, puis à faire de même en binaire au niveau de tes bibliothèques. Il suffit alors d'égorger quelques poulets noirs et de brûler un cierge, et il se peut que ça marche.
    Je collectionne les annonces de marabout, donc les poulets égrogé ça me connais , mais je préfère tout de même une solution à base de classe proxy. Moins hasardeux et plus propre. Et surtout si mon chef me choppe à faire ça je finirais comme ça
    Quand au bug report je vais essayer, mais les libs sont gratos et donc la maintenance rare.

  12. #12
    tut
    tut est déconnecté
    Membre éclairé
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par défaut
    Citation Envoyé par JolyLoic
    Déjà, des bibliothèques qui utilisent des noms comme TOTO, ça fait pas sérieux

    A mon avis la meilleure méthode reste le bug report. Après tout, c'est pour ce genre de choses qu'on paye une maintenance.

    Une solution hyper crade, qui me force à dire "Bien entendu, au cas où vous seriez tué ou capturé, nous nierons avoir eu connaissance de vos agissements.", mais qui a déjà servi dans un cas similaire au frère d'un ami d'une connaissance lointaine, consiste à modifier tes .h pour remplacer TOTO par un autre mot ayant autant de lettres, puis à faire de même en binaire au niveau de tes bibliothèques. Il suffit alors d'égorger quelques poulets noirs et de brûler un cierge, et il se peut que ça marche.
    Je comprends mieux pourquoi tu es "membre chevronné". Félicitations, une idée pareille faut avoir des ressources quand même !

  13. #13
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    Citation Envoyé par JolyLoic
    modifier tes .h pour remplacer TOTO par un autre mot ayant autant de lettres, puis à faire de même en binaire au niveau de tes bibliothèques. Il suffit alors d'égorger quelques poulets noirs et de brûler un cierge, et il se peut que ça marche.
    En tout cas je retient la technique, elle pourra servir à faire des blagues à des potes au prochain 1er avril.

Discussions similaires

  1. Message 'Duplicate index entry'
    Par Poulou dans le forum Administration
    Réponses: 13
    Dernier message: 04/05/2004, 14h57
  2. [jsp] Error #: 482 : duplicate definition of class
    Par antigone dans le forum JBuilder
    Réponses: 4
    Dernier message: 24/07/2003, 10h18
  3. [Sybase] Définition des symboles
    Par SoaB dans le forum Sybase
    Réponses: 5
    Dernier message: 19/03/2003, 23h06
  4. Définition de "Métalangage"
    Par No dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 19/07/2002, 14h05

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