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 :

Conflit de nom C/C++


Sujet :

Langage C++

  1. #1
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Par défaut Conflit de nom C/C++
    Bonjour, je travail sur un projet en C++ qui nécessite l'inclusion de bibliothèques écrites en C. Le problème auquel je suis confronté est le suivant :
    il y a dans un bibliothèque un type qui porte le même nom qu'une des classes de mon projet ce qui entraine des conflits de noms dans tous les sens. J'aurais aimé pouvoir conserver le nom de ma classe tel quel et ne pas être obligé de ruser avec l'utilisation de prefixes ou une modification de l'implémentation pour cacher l'utilisation des bibliothèques.

    Merci d'avance.

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    L'utilisation de namespace pourrait probablement résoudre ton problème.

  3. #3
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Par défaut
    Oui, j'y ai pensé, j'ai pensé à faire quelque chose comme envelopper les includes dans un un namespace mais je me demandais si ça se faisait ou si c'est vaiment du bricolage (aussi ma première tentative n'a pas été un succés, mais j'ai pu me planter quelque part).

  4. #4
    darthmower
    Invité(e)
    Par défaut
    Bonjour,

    si c'est vraiment du bricolage
    Ça n'est pas de la bidouille, sachant que les namespaces sont fait pour éviter les conflits de noms. Ils n'auraient pas grandes utilités sinon.

  5. #5
    Nouveau candidat au Club
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Par défaut
    Bonjour,

    Si les includes qui son enveloppées dans un namespace sont celles de la bibliothèque C, il y a peut de chance que ça fonctionne:
    - la notion de namespace n'existe pas en C et ça risque de foirer un peu à l'édition des liens quand il faudra trouver les symboles de la bibliothèque C qui auront changé à cause de l'inclusion enveloppée dans les namespace.
    - le seul truc à faire quand on inclut des entêtes C dans du code C++ (et quand on veux que l'édition des liens se fasse) c'est le fameux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    extern "C" {
        #include <header_C.h>
    }
    qu'il faut utiliser

    La seule utilisation des namespace disponible est pour encapsuler le code C++ mais pas le code (ou les entêtes) en C.

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Un namespace (anonyme par exemple) pour ton code C++ ne convient-il pas ?

  7. #7
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Par défaut
    Merci de l'attention que vous portez à ma question, actuellement les bibliothèques en question sont X et Cairo, j'ai une classe C++ qui porte le même nom qu'un type de X. Évidement la classe que j'écris est incluse dans un namespace, je pourrais donc préfixer sont type par sont namespace à chaque fois que je l'utilise mais ça devient vite trés contraignant.

    Si quelqu'un à un indice je suis plus que prenneur.

  8. #8
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    je pourrais donc préfixer sont type par sont namespace à chaque fois que je l'utilise mais ça devient vite trés contraignant.
    Pourquoi pas un raccourcie de namespace(Je connais pas le nom "scientifique" de la chose )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    namespace ZZ = Un::Bon::Gros::Name::Space;

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Nogane Voir le message
    Pourquoi pas un raccourcie de namespace(Je connais pas le nom "scientifique" de la chose )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    namespace ZZ = Un::Bon::Gros::Name::Space;
    Cela s'appelle un alias
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Par défaut
    Mon problème n'est pas au niveau du nombre de namespace mais au niveau du conflit de noms avec un type de la lib, je vais donner un example.

    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
    25
    26
    27
     
    // ficher 1 : le header de la lib
    ...
    typedef Anything A;
    ...
     
    // fichier 2 : ma classe
    #include "le_header_de_la_lib"
     
    namespace N
    {
        class A
        {
             ...
        };
    }
     
    // fichier 3 : le main
    #include "ma_classe"
     
    using namespace N;
     
    int main()
    {
        N::A a1; // OK pas de conflit
        A a2; // Erreur on ne sait pas de quel A il s'agit
        return (0);

  11. #11
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Héhé...

    Maintenant que tu es confronté au problème, on ne t'y reprendra surement plus, mais, une saine habitude à prendre est de systématiquement créer au minimum un espace de noms dans lequel prend place tout ton projet.

    Ainsi, au pire, lorsque tu en arrive, par malheur, à utiliser une bibliothèque qui utilise une structure ou une fonction portant le même nom qu'une de tes structures ou fonctions, il reste toujours possible d'éviter les conflits de noms.

    Cependant, l'idée qui consiste à inclure ton fichier d'en-tete au sein d'un autre qui défini ton espace de noms n'est, normalement, pas viable.

    En effet, l'espace de noms entre en ligne de compte lors du "mangling" (lorsque le compilateur décide d'un identifiant unique pour tes structures et fonctions).

    Et, comme seule la déclaration des fonctions et fonctions membres se trouvent dans un espace de noms particulier, mais que leur implémentation se trouve, elle, dans l'espace de noms global, cela ne résout en définitive strictement rien.

    La "moins mauvaise solution" consiste donc à reprendre l'ensemble des fichiers de ton projet (en-tête et implémentation) et à y ajouter l'espace de noms de ton choix (le nom de ton projet semble être un bon choix comme espace de noms principal )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  12. #12
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Par défaut
    Merci de ta réponse claire et complète.


    Mon projet est une lib, j'ai bien tout inclu dans un seul namespace mais se serait mieux de pouvoir utiliser ma classe sans avoir à spécifier le namespace pour éviter les conflits. Si je comprend bien mon problème est insolvable tel quel, je pense que je vais procéder différement, changer le nom de ma classe ou quelque chose d'autre.

    Merci encore de vos réponse.

    PS : à quand un bouton "non-solvable" ?

  13. #13
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    using namespace N;
     
    int main()
    {
        N::A a1; // OK pas de conflit
        A a2; // Erreur on ne sait pas de quel A il s'agit
        return (0);
    }
    Si tu préfixe a chaque fois, tu peut retirer le using namespace, et donc, plus de conflit.

    Si le préfixage t'ennuie a ce point, tu peut aussi faire un typedef du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef N::A NA;
    int main()
    {
        NA a1; // OK pas de conflit
        A a2; // Pas de conflit non plus
        return (0);
    }

  14. #14
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Par défaut
    OK merci du conseil, je voulais juste permettre l'utilisation de "using namespace", tan-pis.

  15. #15
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par soft0613 Voir le message
    OK merci du conseil, je voulais juste permettre l'utilisation de "using namespace", tan-pis.
    Il faut encore être très prudent avec la directive using namespace...

    Typiquement, elle ne devrait être présente que dans les fichiers d'implémentation ( *.cpp) car elle a la facheuse habitude de s'étendre si, par malheur, elle est utilisée en dehors de toute classe ou de toute fonction, au sein d'un fichier d'en-tête ( *.h / *.hpp et les autres).

    En effet, il faut de dire que, même les fichiers qui incluront de manière indirecte le fichier dans lequel se trouve cette directive en profiteront et, au final, tu perdra tout l'avantage premier d'avoir créé un espace de noms "à toi"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. [subversion]branch et conflit de nom de classe
    Par blaise_laporte dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 14/05/2007, 18h07
  2. conflit de noms de classes
    Par pyrrhon_ dans le forum C++
    Réponses: 8
    Dernier message: 11/04/2007, 14h33
  3. Les conflits de nom ?
    Par cicolas dans le forum Spring
    Réponses: 5
    Dernier message: 18/07/2006, 16h28
  4. Réponses: 5
    Dernier message: 23/02/2006, 00h34
  5. conflit de nom avec perlembed et winsock2
    Par clochette dans le forum MFC
    Réponses: 10
    Dernier message: 21/06/2005, 14h42

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