2015-05-15 5 views
5

Ich habe verschiedene Präprozessor Variablen, die den gleichen Namen in verschiedenen Bibliotheken haben.Vermeiden Sie die Neudefinition Preprozessor Variable

Um Konflikte zu vermeiden, was ich tue, ist (im Beispiel gibt es nur 1 widersprüchliche Variable und 1-Header der Einfachheit halber enthalten):

#ifdef VAR 
#define TEMPVAR VAR 
#undef VAR 
#endif 

#include "conflictingheader.hh" 

#ifdef VAR 
#undef VAR 
#endif 

#ifdef TEMPVAR 
#define VAR TEMPVAR 
#undef TEMPVAR 
#endif 

Gibt es eine automatische Art und Weise alle speichern die widersprüchliche Variablen, Undefiniert sie und stellen sie später wieder her?

Oder ist es möglich, ein Makro zu definieren, um diese Operationen auszuführen?

+2

Es ist möglich, Ihre Präprozessor-Elemente so zu benennen, dass andere Module nicht darauf treten (per Konvention, nicht durchgesetzt). Ich glaube, was du verlangst, ist nicht möglich. – mah

Antwort

7

Die C++ - Sprache bietet keine automatisierte Möglichkeit, mit Makros zu speichern und wiederherzustellen. Präprozessormakros (die nicht vom Compiler oder der Befehlszeile des Compilers definiert werden) arbeiten auf einer globalen Dateiebene, und es gibt keine Idee, den Bereich eines Makros auf einen bestimmten Header zu beschränken, der #include ist.

Die Art, wie ich mit einem solchen Problem umgehen würde, ist eine neue Header-Datei erstellen, die Schnittstellen Wrapper für die Funktionalität, die ich brauche aus dieser bestimmten Bibliothek, aber ohne Makroabhängigkeiten. Implementieren Sie dann die Wrapper in einer Quelldatei, die nur diese problematische Header-Datei enthält.


Ihr Compiler kann eine Verlängerung liefern die Aufgabe etwas weniger ausführlich zu machen, aber nicht vollständig in der Art und Weise automatisiert, dass ich Sie verstehen, zu verstehen.

GCC- und Microsoft-Compiler unterstützen Push- und Pop-Makro-Pragmas.

Für die Kompatibilität mit Microsoft Windows-Compiler unterstützt GCC #pragma push_macro("macro_name") und #pragma pop_macro("macro_name").

#pragma push_macro("macro_name")
Dieses Pragma speichert den Wert des als macro_name an die Spitze des Stapels für dieses Makro mit dem Namen Makro.

#pragma pop_macro("macro_name")
Dieses Pragma setzt den Wert des als macro_name auf den Wert oben auf dem Stapel für dieses Makro mit dem Namen Makro. Wenn der Stapel für macro_name leer ist, bleibt der Wert des Makros unverändert.

GCC documentation

+0

Aber dann werde ich die wrapper.hh einschließen, die die Implementierung wrapper.cc enthalten wird, die conflictingheader.hh einschließen wird, so dass meine Datei am Ende noch conflictingheader.hh enthält. Fehle ich etwas? –

+2

Header-Dateien sollten keine Quelldateien enthalten. – jxh

0

Es gibt keinen Standard-Weg, es zu tun. @jxh hat eine großartige nicht standardmäßige Art und Weise. Der Grund, warum es nicht funktioniert, ist, dass Makros überhaupt nicht ausgewertet werden, bis sie erweitert werden. Sie werden nicht ausgewertet, wenn sie in einer anderen Makrodefinition verwendet werden.

#define MY_MACRO VAR 

#define MY_STR_MACRO2(M) # M 
#define MY_STR_MACRO(M) "MY_MACRO = " MY_STR_MACRO2(M) "\n" 

    printf(MY_STR_MACRO(MY_MACRO)); //writes "VAR" 

#define VAR 4 
    printf(MY_STR_MACRO(MY_MACRO)); //writes "4" 

#undef VAR 
    printf(MY_STR_MACRO(MY_MACRO)); //writes "VAR" again 

Auf jeder printf Linie, sieht es bei MY_MACRO und sieht, dass es „VAR“ und sieht dann zu sehen, ob VAR zu etwas definiert ist. Manchmal ist es, manchmal nicht.

Also, wenn Sie dies versuchen:

#define TEMPVAR VAR 

Das einzige, was in TEMPVAR ist „VAR“ Alles, was erfasst wird, die VAR bewerten könnte sich an dieser Stelle nicht betrachtet und nicht, bis es muss bewerten TEMPVAR.

Verwandte Themen