Kann man den CPP dazu bringen makros in makro-definitionen zu expandieren?



  • Hi,

    was ich will verdeutlich ich am besten an einem Beispiel und gewünschter Ausgabe (als Kommentar dahinter):

    #include <stdio.h>
    
    int main() {
    #define FOO printf("hello")
    
        FOO; // hello
    
    #define OLD_FOO FOO
    #undef FOO
    #define FOO printf("new foo")
    
        FOO; // new foo
    
        OLD_FOO; // hello
    
    #undef FOO
    #define FOO OLD_FOO
    
        FOO; // hello
    
       return 0;
    }
    

    So wie es da steht geht es nicht, die Frage lautet daher: gibt es einen Weg um den CPP dazu bringen bei dem "#define OLD_FOO FOO" nicht OLD_FOO auf FOO zu setzen, sondern auf printf("hello")?

    Dahinter steckt kein Problem das ich aktuell lösen möchte, sondern reines Interesse wozu der CPP so fähig ist 🙂


  • Mod

    Kurze Antwort: Nein. Diese Eigenschaft des Präprozessor ist so festgelegt.

    Lange Antwort: Ja, man kann drumrumhacken:
    http://www.boost.org/doc/libs/1_39_0/libs/preprocessor/doc/topics/evaluated_slots.html

    Ich weiß nicht, wie das mit Boost unter C aussieht, aber ich vermute, dass nichts dagegen spricht, die Präprozessorbibliothek zu benutzen. Falls das doch nicht gehen sollte, kann man sich den entsprechenden Quellcode angucken und nachmachen.



  • SeppJ schrieb:

    Kurze Antwort: Nein. Diese Eigenschaft des Präprozessor ist so festgelegt.

    Lange Antwort: Ja, man kann drumrumhacken:
    http://www.boost.org/doc/libs/1_39_0/libs/preprocessor/doc/topics/evaluated_slots.html

    Ich weiß nicht, wie das mit Boost unter C aussieht, aber ich vermute, dass nichts dagegen spricht, die Präprozessorbibliothek zu benutzen. Falls das doch nicht gehen sollte, kann man sich den entsprechenden Quellcode angucken und nachmachen.

    Danke, ob man Boost unter C nutzen kann oder nicht ist für mich weniger wichtig. Ich werd auf jeden Fall mal in die Bibliothek schauen und hoffen, dass ich der Magie folgen kann (Boost Bibliotheken sind ja so schon meist schwer genug zu verstehen).



  • SeppJ schrieb:

    Kurze Antwort: Nein. Diese Eigenschaft des Präprozessor ist so festgelegt.

    Lange Antwort: Ja, man kann drumrumhacken:
    http://www.boost.org/doc/libs/1_39_0/libs/preprocessor/doc/topics/evaluated_slots.html

    Ich weiß nicht, wie das mit Boost unter C aussieht, aber ich vermute, dass nichts dagegen spricht, die Präprozessorbibliothek zu benutzen. Falls das doch nicht gehen sollte, kann man sich den entsprechenden Quellcode angucken und nachmachen.

    So habe mir die Implementierung davon mal angesehen und das ist unglaublich ekelhaft und funktioniert nur mit konstanten Zahlen, also generisch Makros expandieren kann man damit (leider) nicht und scheint somit auch nicht möglich zu sein. Damit wäre das Thema geklärt 🙂


Log in to reply