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
-
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.htmlIch 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.htmlIch 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.htmlIch 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