Praeprozessorvariable zwischenspeichern?

06/01/2011 - 09:00 von Heinz Saathoff | Report spam
Hallo,

kann man eine mit define gesetzte Praeprozessorvariable
zwischenspeichern und anschließend wieder auf den alten Wert
zurücksetzen (so eine Art von Push / Pop)?

Beispielcode:
#include <stdio.h>

void Print() {printf("P");}
void PrintB() {printf("B");}

#define Print PrintB

int main()
{
Print(); // Ausgabe "B"
#ifdef Print
#define SAVED_Print Print
#undef Print
#endif

Print(); // Ausgabe "P"

#ifdef SAVED_Print
#define Print SAVED_Print
#endif

Print(); // Ausgabe "P", soll aber wieder "B" sein
return 0;
}//main


Ausgabe is B P P
statt wie erhofft B P B


Geht das Gewünschte irgendwie?


- Heinz
 

Lesen sie die antworten

#1 Claus Reibenstein
06/01/2011 - 12:09 | Warnen spam
Heinz Saathoff schrieb:

kann man eine mit define gesetzte Praeprozessorvariable
zwischenspeichern und anschließend wieder auf den alten Wert
zurücksetzen (so eine Art von Push / Pop)?



Ist dies eine akademische Frage, oder hat sie auch einen
praxisrelevanten Hintergrund?

Falls Letzteres: Was möchtest Du erreichen? Vielleicht gibt es dafür
einen besseren Ansatz als den, den Du hier erfolglos versuchst.

#define Print PrintB



Hier bekommt Print den Wert PrintB.

#define SAVED_Print Print



Hier bekommt SAVED_Print den Wert Print und nicht etwa PrintB. Grund:
Innerhalb von Pràprozessoranweisungen erfolgt keine Makroersetzung.
Diese erfolgt erst bei der Anwendung des Makros, dann aber rekursiv.

#define Print SAVED_Print



Folglich bekommt hier Print den Wert SAVED_Print.

Print(); // Ausgabe "P", soll aber wieder "B" sein



Hier erkennt der Compiler die zyklische Makrodefinition Print ->
SAVED_Print -> Print und làsst Print deshalb unveràndert stehen.

Ausgabe is B P P



Diese Ausgabe ist genau das, was gemàß dem Standard auch zu erwarten ist.

Geht das Gewünschte irgendwie?



Gute Frage. Nàchste Frage.

Gruß. Claus

Ähnliche fragen