Globale Bezeichner wieder loswerden


  • Mod

    Hallo,

    ich habe den Fall, dass ich eine externe Bibliothek verwenden muss. Leider hatte der Ersteller dieser Bibliothek anscheinend keine Ahnung, was ein using namespace in Headern für Probleme verursachen kann. Kurz gesagt: Der globale Namensbereich ist total verseucht und jetzt habe ich leider dauernd Fehler, dass ich Sachen zweimal definiert habe. Ich weiß aber, dass die doppelten Bezeichner nicht wichtig für die Funktionsweise der Bibliothek sind, sondern einfach nur vom Autor "versehentlich" in den globalen Namensbereich geholt wurden, jedoch nicht benutzt werden. Fällt da irgendjemandem eine Methode ein, wie ich die Bezeichner loswerden könnte, so dass ich nicht a) Mein ganzes Programm umarbeiten muss oder b) Die Header der Bibliothek komplett umarbeiten muss?

    edit: Um das nochmal klarer zu machen, ungefähr sowas habe ich:

    // Einer der Standardheader:
    class std::count{[...]};
    
    [...]
    
    // Bibliotheksheader, bindet den Standardheader ein
    using namespace std; 
    
    [...Code der niemals count benutzt...]
    
    // Mein Programm, benutzt Bibliotheksheader
    void count(){};
    
    [...]
    
    count();  //Fehler: reference to 'count' ist ambigious
    

    Ich bräuchte sowas wie 'undefine count'



  • wenn's nur wenige Dateien mit includes dieser Bibliothek sind, dann kannst Du folgendes machen:

    - Standard-Header, die von den Bib-Headern inkludiert werden vor(!) den Bib-Headern nochmal inkludieren
    - #include <bib/Header.h> mit einem named namespace klammern
    also z.B.

    #include <algorithm> // count
    #include .. sonstiges aus dem Standard
    
    namespace murx
    {
    #include <bib/Header1.h>
    #include <bib/Header2.h>
    }
    

    die using-namespace-std-Deklaration endet mit dem namespace murx, und wirkt danach nicht mehr.
    Anschließend müssen natürlich die Bib-Methoden mit murx::bibFunktion aufgerufen werden.

    Gruß
    Werner


  • Mod

    Ausgezeichneter Vorschlag, das passt genau auf mein Problem. Dankeschön!



  • Und was sagt der Linker dann dazu? Die Bibliotheksfunktionen dürften jetzt doch nicht mehr gefunden werden, da sie den falschen Namensbereich haben...



  • Anderer Vorschlag: Benutze für Deinen Kram einen eigenen Namensraum. Dann kann Dir die "Verschmutzung" von :: mehr oder weniger egal sein.

    Gruß,
    SP


  • Mod

    Ja, da war ich etwas voreilig, weil's bei meinem Testfall funktioniert hat. Aber beim wirklichen Problem hat's nicht funktioniert, unter anderem, weil die von der Bib eingebundenen Standardheader nur im globalen Namensbereich funktionieren. Der umgekehrte Vorschlag von Sebastian Pizer funktioniert aber und ist genauso wenig Arbeit.


Anmelden zum Antworten