Probleme mit Makros



  • Hallo,
    ich hätte eine kleine Frage bezüglich der Verarbeitung von C-Makros und hoffe das jemand eine elegante Lösung kennt.

    Ich habe folgendes Makro:

    #define ENUMELEMENTE \
          START, \
          TEXT, \
          ENDE
    

    Dieses nutze ich zur Definition eines Enums:

    typedef enum MEINENUM_e
    {
          ENUMELEMENTE 
    } MEINENUM_te;
    

    Jetzt würde ich sehr gerne TEXT nur in dem Enum aufnehmen,
    wenn das Makro:

    #define TEXTAKTIV
    

    gesetzt wird.

    Also irgendwie etwas in dieser Art:

    #define ENUMELEMENTE \
          START, \
          --> #if (defined TEXTAKTIV)
          TEXT, \
          --> #endif
          ENDE
    

    Dabei ist es wichtig das diese Unterscheidung in ENUMELEMENTE geschieht.
    Kennt sich jemand hier mit Makros aus?

    Besten Gruß und schon mal einen großen Dank.



  • Wie sieht es aus mit

    #ifdef TEXTAKTIV
    #define TEXT blablubb
    #else
    #define TEXT
    #endif
    


  • DKing schrieb:

    Dabei ist es wichtig das diese Unterscheidung in ENUMELEMENTE geschieht.

    "In" gibt es nicht. Der Präprozessor macht nur Textersetzung. Was möchtest denn machen? (nicht: wie?)



  • Die oberen 3 Code-Schnipsel kommen aus einem Generator und ich habe nur die Möglichkeit ENUMELEMENTE zu bearbeiten.
    Die Lösung aus Antwort 2 würde funktionieren und diese ist auch meine aktuelle Lösung.
    Mich würde allerdings rein theoretisch interessieren ob es einen Weg gibt das ganze innerhalb eines #define zu erledigen.

    Danke schon mal an dieser Stelle 🙂 .


  • Mod

    Man kann etwas in dieser Richtung machen:

    #define CHECK_BOOL(VAL, A, B) CHECK_ ## VAL(A, B)
    
    #define CHECK_0(A, B) B
    #define CHECK_1(A, B) A
    
    #define ENUMELEMENTE(VAL) \
      START,                                  \
        CHECK_BOOL(VAL, TEXT,  )              \
        ENDE
    
    #define TEXTAKTIV 0
    ENUMELEMENTE(TEXTAKTIV)
    
    #undef TEXTAKTIV
    #define TEXTAKTIV 1
    
    ENUMELEMENTE(TEXTAKTIV)
    

    Das ist nur mein lahmer Abklatsch der viel mächtigeren Boost Preprocessor Bibliothek, die du dir mal ansehen solltest (funktioniert auch für C, obwohl Boost für C++ ist, da dieser Teil nur den Präprozessor nutzt (der ungefähr identisch ist für beide Sprachen)). Damit klappt das dann auch halbwegs einfach mit dem Komma, das, wie du siehst, hier ein Problem darstellt. Die Lösung dafür wäre zwar auch nicht komplex, aber ich wollte das Beispiel nicht überfrachten.

    PS: Falls es unbedingt nötig sein sollte, kann man auch was basteln, was bloß auf die Existenz einer Variable prüft. Wird aber ekelig und/oder unflexibel. So ist es viel schöner.



  • O.O


Log in to reply