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

Autres éditeurs Discussion :

[Préprocesseur] macros, ## et concatenation


Sujet :

Autres éditeurs

  1. #1
    Membre éprouvé Avatar de vdemeester
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 110
    Par défaut [Préprocesseur] macros, ## et concatenation
    Bonjour,

    Je travail sur un code, qui n'est pas de moi, où je trouve beaucoup beaucoup de macros (sur plusieurs lignes). Outre le fait que c'est assez moche, et assez difficilement debugguable (enfin je trouve), il y a des petites subtilités. J'ai le code suivant :
    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
    #define m_OasisMsg_sizefct(type) \
    static unsigned short MaxSizeofMsg() {return(sizeof(Oasis##type)                            \
                                            -sizeof(RadioMsgHeader::sizeofLength()));}; \
    static unsigned short sizeofMsgWithoutData( void )                                  \
    {                                                                                   \
        return(MaxSizeofMsg() - MaxSizeofDataPart());                                   \
    }                                                                                   \
    unsigned short sizeofMsg( void )                                                    \
    {                                                                                   \
        //..
    }
     
    /*
     * qui est appelée comme ce qui suit, dans une classe par exemple.
     */
     
    m_OasisMsg_BASIC_FUNCTIONS(StartConnexionReq,E_MNGT_START_CONNEXION_REQ
                                  ,C_ACK_REQUESTED)
    Je n'avais au départ par la moindre idée de la signification des ##. J'ai alors lu la documentation du préprocesseur, de GCC. J'ai lu que c'était utilisé pour faire de la stringification et de la concatenation, et tout s'est éclaircit. En gros, dans l'exemple on veut au final faire un sizeof de OasisStartConnexionReq, qui est une classe. Le seul soucis, c'est que gcc n'a pas l'air de le prendre comme ça, ou en tout cas je me récupère des erreurs du type error: init_Msg_header' undeclared (first use this function), fonction qui est normalement définit par cette macro. Je me pose donc 2 questions :

    1. Le project a été codé au départ avec Visual Studio 6, qui, si je ne me trompe pas, ne supporte pas vraiment les standards puisqu'il est presque aussi vieux . Est-ce le comportement est le même pour le préprocesseur de VC++ 6 et gcc ?
    2. Dans la documentation du préprocesseur, j'ai cru ne pas comprendre, des histoire d'espace. Est-ce réellement la bonne syntaxe ?

    L'exemple donnée dans la documentation du préprocesseur de gcc marche bien (ce qui est normal ), et est le suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #define COMMAND(NAME)  { #NAME, NAME ## _command }
    struct command commands[] =
    {
      COMMAND (quit),
      COMMAND (help),
      ...
    };
    Enfin, une autre utilisation est le cas suivant. Et là, c'est le drame pour ma compréhension.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define m_OasisMsg_init_Bobo(code,ackFlag)            \
    void init_Bobo(unsigned char AckFlag=##ackFlag){    \
     this->msg_header.init(ntohs(code)                          \
                              ,ntoh(sizeofMsg()),AckFlag);      \
    }
    Si quelqu'un a des pistes, ça pourrait m'être grandement utile . (en espérant de pas poster encore une fois de plus dans le mauvais forum)

  2. #2
    Invité
    Invité(e)
    Par défaut
    eh, c'est pas parce qu'on dit beaucoup de choses contre microsoft et sa politique du monopole, que son compileur VC6 ne comprend pas le C et le C++ (avec le standard qui n'etait pas encore paru a l'époque)... ce genre de syntaxe est parfaitement implémentée et comprise par son préprocesseur...

  3. #3
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Pour le deuxieme exemple (avec ackFlag), il n'y a pas lieu de mettre ## puisqu'on ne va pas concatener '=' avec 'ackFlag' !!! (ca genere je crois des warning 'invalid token....').

    Quant a ton pb de compil' (init_Msg_header), je ne vois pas pas ou c'est declarer dans le code que tu donne.

    Pour debugger le code apres passage du pre-compilo, tu peux utiliser -E avec gcc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     gcc <tes options sauf -c et -o> -E toto.c > toto.post.c

  4. #4
    Membre éprouvé Avatar de vdemeester
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 110
    Par défaut
    Citation Envoyé par toxcct
    eh, c'est pas parce qu'on dit beaucoup de choses contre microsoft et sa politique du monopole, que son compileur VC6 ne comprend pas le C et le C++ (avec le standard qui n'etait pas encore paru a l'époque)... ce genre de syntaxe est parfaitement implémentée et comprise par son préprocesseur...
    Bah, c'était une question, sachant que le soucis que j'ai, je l'ai avec g++ et pas avec VC++ 6

    Le init_Msg_header est déclaré dans le #define m_OasisMsg_sizefct(type) (je ne l'ai juste pas mis, car il y avait beaucoup trop de ligne). Il est alors fort probable que l'erreur soit due à autre chose, mais, j'avais envie de savoir/comprendre s'il n'y avait pas de subtiles différences de ce type entre g++ et vc++ 6.

    Je vais tenter de me passer de cette syntaxe.

  5. #5
    Membre éprouvé Avatar de vdemeester
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 110
    Par défaut
    Si je prends cetet déclaration par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define mGLB_SetAttribut(attr) this->##attr = fRight.##attr;
    Elle fonctionne sous Visual C++ 6, mais apparament pas avec g++. On se retrouve ici dans le cas énoncé par D[r]eadLock, et les ## sont inutiles, et il me sort de toute façon une erreur (c'est le même cas que le coup du = mais avec . et ->). Je commence à comprendre .

    VC++ 6 a donc l'air d'être assez laxiste, no ?

  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
    Il l'est, du fait qu'il ne respecte pas un certain nombre de points de la norme.

    Cependant, les dernières versions améliorent _nettement_ cela.

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

Discussions similaires

  1. [XL-2003] Concatener des valeurs dans un tableau par macro
    Par kernkraft dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/01/2011, 06h39
  2. Concatener 2 colonnes par Macro
    Par kernkraft dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/12/2010, 17h11
  3. concatener avec une macro ?
    Par bories81 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/09/2010, 12h43
  4. Mot clé préprocesseur dans une macro ?
    Par oxyde356 dans le forum Langage
    Réponses: 9
    Dernier message: 27/01/2010, 19h37
  5. Pb de remplacement de Macro et Préprocesseur
    Par MogDeChNord dans le forum C
    Réponses: 2
    Dernier message: 02/11/2006, 13h44

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