Verstehe Makro nicht...(#define)



  • Hallo,

    ich habe eine Verständnissproblem mit diesem Makro.

    #define MY_USER_MESSAGE_CODES \
    /* Common*/\
         M(Build = FIRST_APP_MSG)\
                  M(Save)\
                  M(Open)\
                  M(Close)\
                  M(HitTest) \
    /* System Messages */\
        M(WM_Paint)                             /* Window */\
                  M(WM_Close)
    

    Verstehe ich nicht....
    "#define nimmt eine textuelle Erstetzung vor und zwar
    MY_USER_MESSAGE_CODES mit....

    Was in aller Welt ist M(...)

    ich soll einen bestehenden C-Code umschreiben aber ich verstehe das define Zeug nicht.

    Gruß
    Franky



  • FrankTheFox schrieb:

    Was in aller Welt ist M(...)

    Woher sollen wir das wissen?

    Wenn du eine moderne IDE hast, kannst du auf den Bezeichner rechtsklicken und sowas wie "Gehe zur Definition" auswählen. Dokumentation gibts keine?



  • Nexus schrieb:

    Wenn du eine moderne IDE hast, kannst du auf den Bezeichner rechtsklicken und sowas wie "Gehe zur Definition" auswählen. Dokumentation gibts keine?

    1. IDE Eclipse
      F3 über M bringt nichts weil Eclipse nichts anzeigt
    2. Nein keine Dokumentation.
      (Dafür bin ich ja da..)

    Nach dieser Define-Orgie kommt...

    #undef M
    #define M(s) s,
    typedef enum....
    
    und später dann...
    
    #undef M
    #define M(s) #s,
    static const char...
    
    allerdings nachher und nicht vorher...
    

    Gruß
    Frank



  • Wofür stehen denn die Backslashs im ersten Beitrag?
    Teilen die mit dass die Zeichenkette in der nächsten Zeile weitergeht?



  • Zwischenfrager schrieb:

    Wofür stehen denn die Backslashs im ersten Beitrag?
    Teilen die mit dass die Zeichenkette in der nächsten Zeile weitergeht?

    siehe hier, Stichword "line splicing"


  • Mod

    allerdings nachher und nicht vorher...

    Das ist egal, der Präprozessor arbeitet mit so genannter Lazy Evaluation. Das heißt der Ausdruck wird wirklich erst dann ausgewertet, wenn das Makro konkret benutzt wird.

    Beispiel:

    #define WERT 1
    
    #define ALIAS WERT
    
    #undef WERT
    #define WERT 2
    
    ALIAS   // ergibt 2
    


  • Nun gut,

    dann weiß ich was das M.. macht.

    #define MY_USER_MESSAGE_CODES \
    /* Common*/\
         M(Build = FIRST_APP_MSG)\
                  M(Save)\
                  M(Open)\
                  M(Close)\
                  M(HitTest) \
    /* System Messages */\
        M(WM_Paint)                             /* Window */\
                  M(WM_Close)
    

    würde dann sobald MY_USER_MESSAGE_CODES im Code auftaucht

    dort stehen :

    Build,Save,Open,Close,HitTest,WM_Paint,WM_Close

    (und wenn z.B. FIRST_APP_MSG = 2)
    tja und als ganzes betrachtet machts dann auch Sinn, weil

    typedef enum { 
                  MY_INTERNAL_SYSTEM_CODES,
                  MY_USER_MESSAGE_CODES, 
                  MY_USER_CODES
                 } syncpool_message_types;
    

    eine Aufzählung definiert (Was ja auch nicht schwer zu vertehen ist).

    SeppJ schrieb:

    Das ist egal, der Präprozessor arbeitet mit so genannter Lazy Evaluation...

    Ja, war mir entfallen! Das ist des Rätsels Lösung....

    Danke!



  • FrankTheFox schrieb:

    Nach dieser Define-Orgie kommt...

    Haha 😃 👍



  • Mal wieder ein gutes Beispiel dafür wie man seinen Code nicht schreibt 😃
    rya.


Log in to reply