Ich muss ein Makro vorübergehend überschreiben und dann wiederherstellen. Wie:
#define FOO X
#save FOO
#define FOO Y
...
#restore FOO
Ist es im Standard-C-Präprozessor möglich? Im GCC?
HINZUGEFÜGT. Über reales Beispiel. Ich verwende ein globales Makro für die Fehlerausnahme. Es wirkt wie assert
, aber für die dauerhafte Verwendung, nicht nur für Debug-Versionen; So rufe ich zum Beispiel normalerweise Funktionen (mit Nebeneffekt) innerhalb des Makros auf. Es wird einmal definiert, aber die Definition ist nicht dauerhaft; daher weiß ich es a priori nicht. Für einen Teil des Codes brauche ich eine eigene, modifizierte Version des Makros, aber ich möchte Speichern Sie den allgemeinen Codestil. Es sieht hässlich aus, wenn ein Teil des Codes das eine Makro verwendet, der andere Teil ein anderes Makro – beide Makros haben das gleichen Zweckaber etwas andere Implementierung.
Daher ist es gut für mich, das ursprüngliche Makro vorübergehend zu speichern, eine andere Version für einen Teil des Codes zu verwenden und danach das ursprüngliche Makro wiederherzustellen.
Möglich ist dies mit #pragma push_macro
und #pragma pop_macro
. Diese sind nicht Standard-C – sie sind ursprünglich eine MSVC-Erweiterung – aber clang unterstützt sieund so auch GCC.
Beispielnutzung:
int main() {
#define SOME_MACRO 1
printf("SOME_MACRO = %d\n", SOME_MACRO);
#pragma push_macro("SOME_MACRO")
#define SOME_MACRO 2
printf("SOME_MACRO = %d\n", SOME_MACRO);
#pragma pop_macro("SOME_MACRO")
printf("SOME_MACRO = %d\n", SOME_MACRO);
return 0;
}
Drucke:
SOME_MACRO = 1
SOME_MACRO = 2
SOME_MACRO = 1
Du kannst auch #undef
ein Makro in a push_macro
/ pop_macro
Paar, und die pop_macro
Anruf wird es neu definieren.
Wie schon gesagt, es ist nicht wirklich möglich. Je nach Situation kann dies eine Problemumgehung sein:
#include "generalmacrodefs.h" // put them in here or include them indirectly
#undef macro1
#define macro1 "specialized temporary value"
#undef macro1
#include "generalmacrodefs.h" // restores
Das erfordert das generalmacrodefs.h
verwendet ein solches Muster zumindest für die Definitionen, die Sie möglicherweise vorübergehend überschreiben:
#ifndef macro1
#define macro1 "original value"
#endif
Das nächste, was Sie in C erreichen können, ist der #undef
Direktive, die das Makro einfach undefiniert macht, sodass es ersetzt werden kann:
#define FOO X
...
#undef FOO
#define FOO Y
...
#undef FOO
#define FOO X
Das Problem ist, dass Sie den „alten“ Wert von nicht kennen können FOO
sobald Sie es neu definieren – Ihre Werte müssen also an einer Stelle fest codiert werden.
Sie können auch kein Makro erstellen, um die Werte für Sie zu speichern, da es nicht möglich ist, ein Makro zu haben, das andere Präprozessordirektiven in Standard-C erstellt.
13344000cookie-checkÜberschreiben Sie vorübergehend ein Makro im C-Präprozessoryes
Es sei denn, Sie wissen genau, was
FOO
ist vorher und nachher, nein, das geht nicht.– Richard J.Ross III
10. Januar 2013 um 15:42 Uhr
Warum nicht einfach die Namen der Makros ändern? Scheint viel einfacher.
– Ed heilen
10. Januar 2013 um 15:43 Uhr
Bei normalem C bin ich mir nicht sicher, aber in C ++ können Sie push_macro verwenden: stackoverflow.com/questions/1543736/…
– Alex GP
10. Januar 2013 um 15:53 Uhr
Was ist eigentlich Ihr Anwendungsfall dafür? Können Sie ein reales Beispiel dafür geben, wann dies für Sie nützlich sein wird?
– Slugonamission
10. Januar 2013 um 16:55 Uhr
Mögliches Duplikat von Kann ich ein C++-Makro neu definieren und es dann wieder definieren?
– Pelja
11. August 2017 um 14:18 Uhr