#include in namespace



  • Hallo Community,

    ich möchte gerne curses.h in einem Namespace einbinden, da ich Bezeichner benutzen möchte, die in Curses.h vorkommen.

    So

    namespace crs
    {
        #include <curses.h>
    }
    

    meldet der Compiler einen haufen von Fehlern (ca. 600), die alle ähnlich wie

    'whatever' was not declared in this scope
    

    sind.

    ich habe dieses Vorgehen hier im Forum aber schon gesehen und frage mich, wieso das nicht Funktioniert.
    Wenn ich danach noch

    using namespace crs;
    

    hinzufüge, ist alles Kompilierbar 😕

    Woran liegt das? Und was kann man dagegen tun?
    Ansonsten nehme ich halt andere Bezeichner.

    Grüße



  • Hm.
    Also ich halte nix davon wie du das machen willst.

    Aber wieso machst du es nicht umgekehrt - wieso nicht deine eigenen Bezeichner in einen Namespace tun?



  • ja, das ist vllt doch die bessere Lösung.
    Ich dachte nur, da gibts eventuell eine andere Methode.
    Dankeschön!



  • Im konkreten Fall vermute ich, dass dir jede Menge Makros hochgehen. Ansonsten könnte

    namespace crs {
      extern "C" {
        ...
      }
    }
    

    problematisch sein, da bin ich grad nicht ganz sicher. Aber auch, wenn du das irgendwie kompiliert kriegst, wird es dir spätestens der Linker um die Ohren hauen, weil keine ihm bekannte Bibliothek crs::irgendwas definiert.



  • Hyde++ schrieb:

    ich möchte gerne curses.h in einem Namespace einbinden, da ich Bezeichner benutzen möchte, die in Curses.h vorkommen.

    *zeitung-greif* Böser Programmierer! *mit-der-zeitung-aushol*

    Pack einfach Deinen Kram in einen Namensraum!



  • *weg-duck*

    😃

    okok



  • aber wie ist das denn mit den alten C-Headern?

    die wurden doch auch nur in den std namespace geschoben (cmath und so)

    und wieso geht das nicht, dass man in einen namespace inkludet?
    (unabhängig ob mand as machen soll oder nicht)



  • Skym0sh0 schrieb:

    aber wie ist das denn mit den alten C-Headern?

    Die C++ Header enthalten sicherlich nicht

    namespace std {
    #include <stdio.h>
    }
    

    !!!
    sondern eher so etwas wie

    #include <stdio.h>
    namespace std {
      using ::printf;
      ...
    }
    

    Wie die Hersteller das implementieren ist nicht wirklich wichtig. Hauptsache, all die Namen, die im std-Namensraum zu sein haben, sind auch da. Darauf, dass die Namen gleichzeitig im globalen Namensraum anzutreffen sind, kann man sich nicht verlassen.

    Skym0sh0 schrieb:

    und wieso geht das nicht, dass man in einen namespace inkludet?

    Scheinbar verstehst Du nicht ganz, was #include macht. #include ist eine reine Textersetzung. Falls Du die ODR (one definition rule) nicht kennst, schlage auch die in Deinem C++ Buch nach.

    #ifndef HEADER
    #define HEADER
    
    void foo();
    
    #endif
    
    #include "header.h"  // <-- hier wird ::foo deklariert
    
    void foo() {}        // <-- hier wird ::foo definiert
    
    namespace wtf {
    #include "header.h"  // <-- hier wird wtf::foo deklariert
    }
    
    int main()
    {
      wtf::foo();        // <-- hier wird wtf::foo aufgerufen
    }
    

    Aber: Nirgens wird wtf::foo definiert.



  • doch, ich weiss sehr wohl, dass include reine textersetzung des preprocessors ist. und ich kenne auch die ODR...

    also ists so, dass man quasi per include in den namespace die deklaration in den namespace verschiebt, jedoch nicht die definition?!? die ist ja meistens in schon in den bibliotheks dateien...

    aber dann müsste das ja mit templates klappen ?!?


Anmelden zum Antworten