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 :

les macro intelligents en c++ [question]


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 44
    Par défaut les macro intelligents en c++ [question]
    salut les développeurs
    j'ai une petite question sur les macro en c++

    j'ai déclaré un macro dans mon code c++ comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define sub(type,nom) type get() { return nom; }
    le macro marche très bien , mais le problème c que je veut appelé ce macro pour tts les attributs de ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class test{
     
    int a; sub(int,i)
    double d ; sub(double,d) <== la ça ne marchera pas 
    ...
    }
    existe il une solution pour faire un seul macro pour tts les attributs du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define sub(type,nom) type get_type(){return nom;}
    j'ai testé cette dernière solution mais ça n'a pas marché

    je voudrai que la macro change le nom de la fonction get pour chaque attribut .

    un grand Merci pour vous

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    normalement avec une classe ça devrait marcher:

    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
    #include <iostream>
     
    using namespace std;
     
    #define sub(type, nom) type get_##nom () { return nom; }
     
    int a, b;
     
    sub(int, a);
     
    int main()
    {
        a = 10;
        b = get_a();
     
        cout << b << endl;
        return 0;
    }
    L'opérateur ## permet de concaténer un argument avec autre chose, voire un autre argument, dans une macro.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 44
    Par défaut
    Merci bcp pour la réponse
    ca marche parfaitement maintenant
    une autre petite question :

    est ce un macro peut manipuler des tableaux ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define macro(type,nom) get(){ //traitements ici  }
    avec nom un tableau
    merci

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    j'ai trouvé encore mieux pour la fonction d'avant (pas besoin de fournir le paramètre type):

    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
    #include <iostream>
     
    using namespace std;
     
    #define sub(nom) typeof(nom) get_##nom () { return nom; }
     
    int a, b;
     
    sub(a);
     
    int main()
    {
        a = 10;
        b = get_a();
     
        cout << b << endl;
        return 0;
    }
    Sinon, oui, on peut utiliser des [] à côté d'un nom de tableau dans une macro, mais j'ai l'impression de ne pas très bien voir ce que tu veux faire.

  5. #5
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 44
    Par défaut
    salut
    j'ai testé le truc de typeof(nom) mais apparemment ça n'a pas marcher pour moi

    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
     
    #include<iostream>
    using namespace std;
    #define reflected(Nom) \
    typeof(Nom) get##Nom(){ return Nom;} \
    void set##Nom(typeof(Nom) a){Nom = a;}
     
    class test
    {
        int i ;reflected(i)
        double d ; reflected(d)
    }
     
    void main()
    {
      test T;
      cout<< T.geti();
      T.setd(12.3);
    }
    existe il le macro typeof en c++ ?

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    typeof est une extension de gcc; il va y avoir decltype qui est similaire en C++0X.

    En passant, quand on se met à faire des macros pour faciliter les accesseurs, ça me semble un signe qu'il y en a trop.

Discussions similaires

  1. Question sur les macros compilées
    Par JeromeMATHIAS dans le forum Macro
    Réponses: 3
    Dernier message: 15/10/2012, 22h39
  2. Question sur les macros
    Par aiolia_aiolos dans le forum C++
    Réponses: 3
    Dernier message: 11/04/2008, 11h20
  3. Question d'ordre général sur les macros sur excel
    Par tzehani dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 29/08/2007, 05h16
  4. petite question sur les macros complémentaires
    Par kbakouan dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/07/2007, 15h17

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