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 :

enum - macros


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur Junior
    Inscrit en
    Septembre 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 170
    Par défaut enum - macros
    Bonjour à tous !
    Je dois créer une liste de tables dans un fichier séparé(par macro).

    Jusqu’à maintenant, les tables de mon programme étaient crées avec des enums :

    Fields.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    enum Table
    {
    	// user data tables
    	table_events       = 1,
    	table_activities   = 2,
    //	table_notes        = 3, // no longer in use
    	table_variables    = 4,
    	table_availability_ranges = 5,
     
    	// local table metadata, not part of the repository
    	table_local_store_data = 9000,
    };*/
    fields.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    static NameTablePair name_table_pairs[name_table_pair_count] =
    {
    	// user data tables
    	{ "events",       table_events }, // no longer in use, except by unit tests
    	{ "activities",   table_activities },
    //	{ "notes",        table_notes }, // no longer in use
    	{ "variables",    table_variables },
    	{ "availability_ranges", table_availability_ranges },
     
    	// local table metadata, not in repository
    	{ "local_store_data", table_local_store_data },
    };

    je dois modifier ces fichiers de façon à créer les tables par macro, je voulais savoir si je m'y prenais bien, et si ce n'est pas le cas, pourquoi

    j'ai rajouté un fichier field.inc comportant les macros
    Fields.inc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define Table \
    name_table_pairs(events, 1) \
    name_table_pairs(activities, 2) \
    name_table_pairs(variables, 4) \
    name_table_pairs(availability_ranges, 5) \
    name_table_pairs(table_local_store_data, 5)
    j'ai modifié le fichier .h pour 'remplir' mes enum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    enum Table {
    #define name_table_pairs(a, b) table_##a,
    #undef name_table_pairs,
    #include "Fields.inc",
    #undef name_table_pairs
    };
    j'ai pas mal d'erreurs au niveau de mon enum dans le .h, savez-vous d’où ça vient ?

    Merci de vos conseils

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    avant toute chose, sais-tu ce qu'est une macro et comment ça fonctionne ?
    C'est juste quelque chose qui sera remplacé avant la compilation.

    Donc quelque soit la forme choisie, tu dois avoir le même résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i = 0;
    #define VAR(type, name, val) type name = val
    VAR(int, i, 0);
    Et autour de ça, tu as 2 mot-clés principalement qui sont #define et #undef, respectivement pour déclarer et supprimer une macro.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define name_table_pairs(a, b) table_##a,
    #undef name_table_pairs,
    #include "Fields.inc",
    #undef name_table_pairs
    Tes macro font quoi ?
    Tu déclares une macro qui prend 2 paramètres, et n'en utilise qu'un seul
    la ligne suivante tu la supprimes
    Une virgule après un include
    Le fichier inclus lui ne fait que déclarer une macro
    Puis tu supprimes une macro qui n'existe pas

    Puisque tu as l'original, vas-y par étape..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    enum Table
    {
    	// user data tables
    	table_events       = 1,
    	table_activities   = 2,
    //	table_notes        = 3, // no longer in use
    	table_variables    = 4,
    	table_availability_ranges = 5,
     
    	// local table metadata, not part of the repository
    	table_local_store_data = 9000,
    };
    pourrait devenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #define BEGIN_ENUM(name) enum name {
    #define END_ENUM() };
    #define ENUM(name, value) name = value,
     
    BEGIN_ENUM(table)
    // user data tables
    ENUM(table_events, 1)
    ENUM(table_activities, 2)
    // ENUM(table_notes, 3) // no longer in use
    ENUM(table_variable, 4)
    ENUM(table_availability_ranges, 5)
    // local table metadata, not part of the repository
    ENUM(table_local_store_data, 9000)
    END_ENUM()
    etc..
    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.

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur Junior
    Inscrit en
    Septembre 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 170
    Par défaut
    Merci beaucoup, je vais suivre à la lettre vos conseils.

    En effet, je n'ai jamais programmé avec des macros, j'ai essayé de m'inspirer de ce que je pouvais trouver sur le net, les forums etc etc :/

    Merci pour votre réponse, je vais faire comme ça

    Je ne met pas le sujet résolu tout de suite au cas ou j'ai d'autres soucis concernant ceci

  4. #4
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Mouais, enfin, tous les bons auteurs, à commencer par Stroustrup, conseillent d'éviter au maximum les macros en C++...

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur Junior
    Inscrit en
    Septembre 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 170
    Par défaut
    c'est ce que j'ai cru comprendre vu les réactions sur le chat :/
    Mais je suis en stage, et c'est ce qu'on me demande.

    Ne connaissant pas assez la matière, je préfère exécuter ^^

  6. #6
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Là on comprend...

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    Mouais, enfin, tous les bons auteurs, à commencer par Stroustrup, conseillent d'éviter au maximum les macros en C++...
    Il ne faut pas dramatiser les macros sous prétexte qu'on est en C++.

    Une macro a une utilité simple qu'il faut utiliser correctement : remplacer une donnée avant la compilation.
    Ca permet de réaliser certaines opérations sympas, de déclarer des infos et actions à la compilation plutôt qu'au run-time, ...
    Ou tout simplement d'avoir une syntaxe plus sympa, éviter les répétitions de copier/coller de code, ...

    Bref, à ne pas jeter arbitrairement.
    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.

  8. #8
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Il y a tout un tas de bonnes raisons d'utiliser ces 'disgusting macros' (selon les termes de Stroustrup) le moins souvent possible en C++ et seulement dans les rares cas où c'est réellement souhaitable. Voir par exemple là-dessus Scott Meyers, Effective C++, Third Edition, Item 2.

    Voir aussi dans la FAQ de Stroustrup, ce passage :
    http://www.stroustrup.com/bs_faq2.html#macro
    et celui-ci :
    http://www.stroustrup.com/bs_faq.html#unsafe

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

Discussions similaires

  1. Macros et typedef enum {MUR=0x1,etc. HELP !
    Par qwerty999 dans le forum C++
    Réponses: 2
    Dernier message: 07/06/2006, 22h44
  2. [VB6] Exécuter une macro Access
    Par Nektanebos dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 22/02/2006, 16h32
  3. [VBA-E] [Excel] Lancer une macro à une heure donnée
    Par Lysis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/10/2002, 12h15
  4. Qu'est-ce qu'une macro ?
    Par karli dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/09/2002, 03h38
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

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