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 :

[typedef] protection à travers les espaces de noms


Sujet :

C++

  1. #1
    Membre éprouvé Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Par défaut [typedef] protection à travers les espaces de noms
    Je vous expose mon problème :
    Je dois utiliser une bibiothèque écrite en C et j'ai mis une interface dans un espace de noms
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "fichier_C.h"
    namespace monEspace {
    typedef struct_C MyStruct;
    void MyFunction(MyStruct *);
    }
    j'amerais savoir si je protège bien l'utilisation de monEspace::MyFunction et qu'on ne pourra pas l'appeler avec un struct_C

    Autre question : il y a une constante macro dans le fichier .h REAL qui correspond soit à double soit à float et qui est utilisée dans struct_C mais elle n'est définie que dans le fichier .c (qui au passage fait 15 000 lignes )

    pour pas que cela plante il y a donc un
    juste avant l'inclusion.
    mais j'aimerais pouvoir l'inclure dans dans l'espace de noms. Avez-vous des solutions moins bancales ?
    Je vous remercie par avance 8).

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    j'amerais savoir si je protège bien l'utilisation de monEspace::MyFunction et qu'on ne pourra pas l'appeler avec un struct_C
    Ben non. typedef c'est juste pour créer un alias


    pour pas que cela plante il y a donc un
    juste avant l'inclusion.
    mais j'aimerais pouvoir l'inclure dans dans l'espace de noms. Avez-vous des solutions moins bancales ?
    Ben utilise un typedef déjà au lieu d'un #define. Après j'ai pas bien compris, peut-être veux tu faire un truc dans ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    namespace perso
    {
        typedef double REAL;
        #include "fichier_C.h"
    }
    namespace monEspace
    { 
        typedef perso::struct_C MyStruct; 
        void MyFunction( MyStruct * ); 
    }

  3. #3
    Membre éprouvé Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    j'amerais savoir si je protège bien l'utilisation de monEspace::MyFunction et qu'on ne pourra pas l'appeler avec un struct_C
    Ben non. typedef c'est juste pour créer un alias
    je trouve cela dommage de ne pas protéger comme cela l'utilisation de MyFunction avec une obligation d'utiliser une variable de l'espace de nom. Qu'en pensez-vous ?
    Car en fait le truc aurait été de pouvoir protéger de l'utilisation avec REAL = float. avec ce que j'avais déjà proposé, je ne sais pas si cela marche mais a priori le #define dans le même fichier doit pouvoir l'assurer.
    Aurélien>>j'aime bien ce que tu m'as proposé, je n'ai pas eu le temps de l'adapter sans erreur à la compilation mais je le garde sous le coude quand j'aurais le temps car on doit avancer dans le projet.
    Merci beaucoup.

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    je trouve cela dommage de ne pas protéger comme cela l'utilisation de MyFunction avec une obligation d'utiliser une variable de l'espace de nom. Qu'en pensez-vous ?
    Ben typedef ça crée pas un nouveau type, ça sert juste à définir un alias. Pour créer un nouveau type c'est struct/class. Si typedef créait un nouveau type, le code suivant produirait une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    namespace toto
    {
        typedef double Real;
        void Test( Real );
    }
     
    Test( 10.5 ); // error : could not convert double to type Real


    je le garde sous le coude quand j'aurais le temps car on doit avancer dans le projet.
    moi aussi j'ai plein de trucs sur ma todo list...

  5. #5
    Membre éprouvé Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    [

    Ben typedef ça crée pas un nouveau type, ça sert juste à définir un alias. Pour créer un nouveau type c'est struct/class. Si typedef créait un nouveau type, le code suivant produirait une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    namespace toto
    {
        typedef double Real;
        void Test( Real );
    }
     
    Test( 10.5 ); // error : could not convert double to type Real
    justement c'est ce que je veux : Test ne peux être exécuté qu'avec des types appartenant à l'espace de noms.
    on a aussi pensé à redéfinir la classe(copier/coller) et faire un transtypage quand on appelle la fonction de la bibliothèque à l'intérieur de MyFunction.

  6. #6
    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
    Les "strong typedef" sont dans la liste des évolutions du C++. Mais ce n'est pas pour demain, surtout que si tout le monde est d'accord pour avoir des s"strong typedef", personne n'est d'accord pour savoir exactement ce dont il s'agit.
    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.

  7. #7
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    J'ai moi aussi désiré un tel comportement. J'ai créé ma propre classe avec un constructeur explicit et un opérateur de conversion vers le type empaqueté. Un template dans ce genre si je me souviens bien:
    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
     
    template<typename T>
    class TypeMaker
    {
    public:
        explicit TypeMaker( const T & t ) : value( t ) {}
        operator T &() { return this->value; }
        operator const T &() const { return this->value; }
        T * operator &() { return &this->value; }
        T & operator = ( const T & t ) { this->value = t; return this->value; }
     
        T value;
    };
     
    typedef TypeMaker<double> Real;
     
    int main()
    {
        Real r( 10.5 );  
        r = 10;
        double d = r;      
    }
    En fonction de tes exigences tu peux virer ou non le explicit.

  8. #8
    Membre éprouvé Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Par défaut
    c'est intéressant ce que tu m'as donné Aurélien.
    en tout cas, pour les strong typedef, je les ferais un peu comme expliqué plus haut avec une portée au niveau des espaces de noms. Une fonction de cet espace de noms avec un strong typedef comme argument serait forcément appelé avec ce type d'argument et pas avec un alias de cet argument.
    clairement, cela ne marcherait pas au niveau des classes à cause des fonctions amies.
    d'un autre côté je n'ai pas assez de recul et je suis trop nul en C++ pour juger de toutes les possibilités

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

Discussions similaires

  1. Les espaces de noms en PHP 5.3
    Par RideKick dans le forum Langage
    Réponses: 33
    Dernier message: 26/01/2009, 04h29
  2. Réponses: 4
    Dernier message: 27/11/2008, 02h03
  3. [DOM] Générer dans un document DOM les espaces de nom + schemaLocation
    Par be_tnt dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 09/10/2006, 13h28
  4. Supprimer les espaces des noms de fichier
    Par Cathy dans le forum Linux
    Réponses: 20
    Dernier message: 04/08/2005, 17h13

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