2017-06-08 5 views
-1

Gibt es eine Möglichkeit, Makros in C wiederherzustellen, so dass Sie ein neues Makro definieren können, unter welchem ​​Namen wahrscheinlich andere Makros bereits definiert sind, und es mit dem vorherigen Wert neu definieren?Wiederherstellen von Definitionen und Makros

so dass Makros gelöscht werden und neu definiert werden, wenn neu definierte Makros in den vorherigen Zustand zurückgesetzt werden?

Beispiel:

// a macro parameter used in a library 
#define size 10 
#include <library/use_size.h> 

//here the command/pragma to save the definitions 
    #define size (100/sizeof(size_t)) 
    // some use of size ... 
//here the command/pragma to reset the definitions 

#include <library/allocator_with_size.h> 

#undef size 

// use size as a variable name 
size_t size = 0; 
//... 
size += 123; 

Edit: Ich möchte nicht #undef verwenden, da es keine alten Makros nicht wiederherstellen. Auch wenn Sie viele Makros haben, zB um sie in einer X-Makro-Liste zu verwenden (in einem langen repetitiven Code/Deklaration von konstanten Arrays und Strukturen), sieht es hässlich aus, wenn es viele #undef Direktiven gibt.

+1

Wie wäre es mit '# undef? –

+1

#undef size .... – OldProgrammer

+1

Auch gibt es keinen "vorherigen Zustand" zu Makros. Sie sind entweder definiert oder nicht. –

Antwort

1

Ok ich recherchierte selbst und fand die Pragmas push_macro und pop_macro, unterstützt von clang, gcc und visual C++. Ich benutze Klänge, also ist es kein Problem, sie zu benutzen. Der Nachteil: es nicht die Linienzählung reduzieren, wenn Sie mehrere Makros ¹ wiederherstellen möchten, aber es stellt die Makros und eingekapselt werden können:

#pragma push_macro("size") 
    #define size (100/sizeof(size_t)) 
#pragma pop_macro("size") 

Hinweise:

¹ I definiert mehrere Makros und versuchte sie wiederherzustellen mit:

#pragma push_macro("size", "key", "name") 
    // define them all 
#pragma pop_macro("size", "key", "name") 

Aber das ist noch nicht in den Compilern implementiert. Für jedes Makro muss also eine separate Zeile vorhanden sein.

+0

Wenn Sie es in einem #pragma tun können, können Sie einstellen Makros, um mehrere Aufrufe pro Zeile zu ermöglichen (funktioniert nicht in MSVC; sie sind alle durcheinander; obwohl sie in der Theorie einen Weg dazu haben, emittiert ihre nicht standardmäßige Pragma-Variante Müll für push_macro und pop_macro). Aber das hört sich ein bisschen gefährlich an ... wenn du das nicht in Kopfzeilen machst, warum brauchst du das Pop? Keine andere Einheit wird Ihre neu definierten Varianten sehen (und selbst wenn Sie sie "brauchen", könnten Sie einfach den Code neu anordnen). Wenn du _ bist_, entwirfst du nicht auch etwas Zerbrechliches? (Anstatt in einem Header zu erscheinen, sollten Sie nicht kollidieren?) –