Kann mir mal einer das mit dem Namespace erläutern ?



  • Hi, ich habe meinerzeit alle includes brav mit <blahblah.h> geschrieben, nun
    sagte mir einer das man das .h weglassen und immer dieses using namespace std; reinsetzen soll.
    Ich bin aus den Erklärungen irgendwie überhaupt nicht schlau geworden...

    Kann mich da wer erleuchten ? 😕

    Danke schonmal.



  • ja.. ein tutorial über namepaces 🙂



  • Das hat mit Namespaces an sich nichts zu tun. Es ist vielmehr so, dass sich das Standardisierungskommitee unter anderem zu 2 Dingen entschlossen hat: 1) Die gesamte Standardbibliothek wird in den Namensraum std verlagert. 2) Die Standardheader haben keine Dateiendung.

    Es gab aber nun schon vor der Standardisierung (die übrigens 1998 abgeschlossen wurde) C++-Implementierugen, und viele Programme, die für diese geschrieben wurden. Heutige C++-Implementierungen sollten daher die gängige Vor-Standard-Praxis zusätzlich noch beibehalten. Inkludierst du also <iostream.h>, bekommst du die "historische" iostream-Implementierung, die vor der Standardisierung üblich war. Inkludierst du <iostream>, bekommst du es so wie es im Standard steht. Das heißt u.a. auch, dass alles in std liegt.



  • Hier siehst Du die Wirkung von ::, std:: und MyCpp::
    Damit kannst Du eine Variable gleichen Namens nebeneinander in main() verwenden.

    #include <iostream> // für cout, endl 
    #include <conio.h>  // für getch()
    
    namespace MyCpp
    {
      double variable;
    }
    
    float variable;
    
    int main() 
    { 
      int variable;
    
      std::cout << "globale variable     : "  << ::variable      << std::endl; // 0
      std::cout << "lokale variable      : "  << variable        << std::endl;
      std::cout << "variable im Namespace: "  << MyCpp::variable << std::endl; // 0
    
      getch();
    }
    


  • dann ist namespace ja sowas ähnliches wie struct?



  • Du hast den Header in dein Projekt eingebunden. Alle Klassen und Funktionen dieses Headers sind im Namespace std geschrieben.

    Das heißt du kannst zum Beispiel

    cout << "blah"
    

    nur mit

    std::cout << "blah"
    

    aufrufen wenn du nicht am anfang

    using namespace std;
    

    schreibst. Dieses "using namespace" bringt dass du dieses std:: vor allen Funktionen etc weglassen kannst die in dem Namespace deklariert wurden.
    Namespaces werden meistens dazu benutzt um in großen Projekten die gleichen Variablen- oder Klassennamen verwenden zu können. Du könntest dir auch einen eigenen Namespace anlegen und deine Funktionen etc. in ihm schreiben. dann würden sich diese aber auch nur mit

    NameDeinesNamespace::NameDeinerFunktion
    

    aufrufen lassen. Dort könntest du dann auch eine eigenes Objekt "cout" erstellen das sich mit

    NameDeinesNamespace::cout
    

    aufrufen ließe und überhaupt nichts mit dem anderen cout zu tun hat.
    Order



  • SpaceMonkey schrieb:

    dann ist namespace ja sowas ähnliches wie struct?

    Das ist ein ganz anderes konzept. sicher dient es auch zum kapseln, aber du kannst zb einen namespaces auf mehrere Dateien aufteilen. Aber um das besser zu verstehen rate ich dir zu einem Tutorial, das namespaces bespricht.


Anmelden zum Antworten