Überschreiben Sie vorübergehend ein Makro im C-Präprozessor

Lesezeit: 4 Minuten

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.

  • 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

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.

  • Wenn das Makro wann nicht existierte push_macro heißt dann pop_macro wird es auch aufheben. (zumindest auf MSVC)

    – Brandlingo

    16. April 2020 um 14:25 Uhr

  • Wenn das Makro definiert wird, bevor das Pragma push_macro verwendet wird, wird es immer noch danach definiert, also müssen Sie das Makro technisch aufheben, bevor Sie es neu definieren. Trotzdem gefällt mir diese Antwort sehr gut.

    – Cardiff-Weltraummann

    16. Juli 2020 um 17:04 Uhr

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

  • Sowohl in gcc als auch in Visual Studio können Sie #pragma push_macro und #pragma pop_macro verwenden.

    – Rob L

    28. November 2018 um 23:47 Uhr

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.

  • Ich kenne den alten Wert nicht FOO oder es kann eine zu große Definition haben.

    Benutzer1150105

    10. Januar 2013 um 15:55 Uhr

  • @ user14284 dann hast du Pech gehabt. Dafür gibt es in C keine Lösung. Gibt es einen bestimmten Grund, warum Sie das Makro nicht umbenennen können?

    – Richard J.Ross III

    10. Januar 2013 um 15:58 Uhr

  • Vielleicht gibt es eine Lösung mit GCC? Und was meinst du mit “umbenennen”?

    Benutzer1150105

    10. Januar 2013 um 16:04 Uhr

  • @RichardJ.RossIII – C sucht nicht nach Makros.

    – Ed heilen

    10. Januar 2013 um 16:18 Uhr

1334400cookie-checkÜberschreiben Sie vorübergehend ein Makro im C-Präprozessor

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy