Eigene Namespaces erstellen



  • Hallo Leute , kurze Frage, habe heute mal nen eigenen namspace fuer ein paar Funktionen erstellt und promt hat mich der Compiler mit "Nicht-kompilieren" bestraft.

    Habe das jetzt nach besten Wissen und gewissen zum laufen gebracht und wollte fragen ob das auch so richtig ist, bzw. ihr in der Praxi9s das evtl. anders löst?

    Ich habe den Namespace in ner hpp deklariert

    //in mynsp.hpp
    
    namespace Dummy{
    
        void foo1();
        void foo2();
    }
    

    Dann wie bei "normalen" Klassen oder Funktionen die definition in eine cpp datei geschrieben.

    Überall wo ich jetzt die Funktionen brauche, mache ich

    #include "mynsp.hpp"
    using namespace Dummy
    

    ....Passt das so ?



  • Bis auf das fehlende ; beim using sieht es richtig aus. Ansonsten meldet sich der Compiler 😉



  • Ich finde das irgendwie sinnlos. Als erstes steckst du die Funktionen in einen Namespace und holst sie anschließend mit using namespace wieder heraus. Klar geht es so, aber standardmäßig würde ich das nicht so machen.



  • @patrick246
    Natürlich macht das auch so immer noch Sinn.
    In Modul A brauche ich Namespace X, mach ich halt ein using namespace X.
    In Modul B brauche ich Namespace Y, mach ich halt ein using namespace Y.
    Und wenn es dabei X::Foo und Y::Foo gibt, hat man trotzdem kein Problem.
    Das ist der Sinn.

    Wenn man überall X:: und Y:: vorn dranschreiben möchte, ist das auch OK. Aber zu behaupten die using namespace Variante würde Namespaces ad absurdum führen, finde ich ... einfach nur falsch.



  • Ich würde prinzipiell partrick246 zustimmen. Man sollte das besser begründen.

    So wie hustbaer es sagt, kann man es machen.

    Das Problem ist, wenn ich in einem Modul beide Namespaces brauche. Dann darf ich nur bei einem ein using namespace machen und beim anderen voll qualifizieren. Das finde ich sehr unschön, da es uneinheitlich ist.

    Beispielsweise muss ich Symbole im Namespace Y voll qualifizieren, aber nur, wenn ich Namespace X brauche. Da erzeuge ich eine merkwürdige Beziehung zwischen den Namespaces. Es könnte sogar passieren, dass ich ein Modul mit using namespace X erstellt habe und ein anderes mit using namespace Y. Durch Umstrukturierung (neudeutsch: refactoring) kommen teile aus einem Modul in das andere. Da muss ich genau schauen, welche Symbole ich jetzt umbenennen muss.

    Ein anderes Argument betrifft Header. In Headern ist using namespace verboten (also nicht vom Compiler aber das ist nicht nur schlechter, sondern ganz schlechter Stil). Daher muss ich im Header immer voll qualifizeren. Es wäre jetzt wieder inkonsequent, das im cpp nicht zu machen.

    Daher verwende ich praktisch nie ein using namespace (auch nicht bei std) sondern qualifiziere alle Symbole voll.



  • tntnet schrieb:

    Daher verwende ich praktisch nie ein using namespace (auch nicht bei std) sondern qualifiziere alle Symbole voll.

    Ich nenne eigene Sachen wie so wie der STandard, also kanns nicht zu Konflikten kommen, ich benutze gerne using namespace std.



  • volkard schrieb:

    tntnet schrieb:

    Daher verwende ich praktisch nie ein using namespace (auch nicht bei std) sondern qualifiziere alle Symbole voll.

    Ich nenne eigene Sachen wie so wie der STandard, also kanns nicht zu Konflikten kommen, ich benutze gerne using namespace std.

    blöd ist nur, wenn der standard etwas als "vector" bzeichnt, was kein vector ist. das kollidiert dann halt mit allem...



  • otze schrieb:

    volkard schrieb:

    tntnet schrieb:

    Daher verwende ich praktisch nie ein using namespace (auch nicht bei std) sondern qualifiziere alle Symbole voll.

    Ich nenne eigene Sachen wie so wie der STandard, also kanns nicht zu Konflikten kommen, ich benutze gerne using namespace std.

    blöd ist nur, wenn der standard etwas als "vector" bzeichnt, was kein vector ist. das kollidiert dann halt mit allem...

    ist das dann ein colliding_vector<> ?



  • otze schrieb:

    volkard schrieb:

    tntnet schrieb:

    Daher verwende ich praktisch nie ein using namespace (auch nicht bei std) sondern qualifiziere alle Symbole voll.

    Ich nenne eigene Sachen wie so wie der STandard, also kanns nicht zu Konflikten kommen, ich benutze gerne using namespace std.

    blöd ist nur, wenn der standard etwas als "vector" bzeichnt, was kein vector ist. das kollidiert dann halt mit allem...

    ausser, man kennt das geheimniss der gross_buchstaben. 🤡



  • volkard schrieb:

    otze schrieb:

    volkard schrieb:

    tntnet schrieb:

    Daher verwende ich praktisch nie ein using namespace (auch nicht bei std) sondern qualifiziere alle Symbole voll.

    Ich nenne eigene Sachen wie so wie der STandard, also kanns nicht zu Konflikten kommen, ich benutze gerne using namespace std.

    blöd ist nur, wenn der standard etwas als "vector" bzeichnt, was kein vector ist. das kollidiert dann halt mit allem...

    ausser, man kennt das geheimniss der gross_buchstaben. 🤡

    Wie jetzt? collision_Vector ? 🤡



  • @volkard
    Du hast aber geschrieben du benennst eigene Sachen so wie der Standard, und dass es daher nicht zu Kollisionen kommen kann.

    Ich denke du hast da einfach ein "nicht" vergessen.

    Sonst macht auch dein Hinweis mit den Grossbuchstaben keinen Sinn, denn der Standard verwendet für Klassen und Funktionsnamen ja eben gerade keine Grossbuchstaben.



  • Ich glaub vielmehr, da trollt einer ... 🤡



  • Der Anfangspost kam für mich so rüber wie "um Funktionen aus dem Namespace zu nutzen, schreib ich da ein using namespace hin", also als ob das die einzige Möglichkeit wäre.

    Ich bin durchaus der Meinung, dass man using namespace verwenden kann, wenn man sich sicher ist, dass dadurch keine Kollisionen entstehen, aber wenn ich nicht genau weiß, was in dem Namespace drin ist, dann lass ich das lieber, vor allem bei std.



  • hustbaer schrieb:

    Ich denke du hast da einfach ein "nicht" vergessen.

    Stimmt.



  • Der Anfangspost kam für mich so rüber wie "um Funktionen aus dem Namespace zu nutzen, schreib ich da ein using namespace hin", also als ob das die einzige Möglichkeit wäre.

    SRY für die späte Meldung. Eitentlich ging es mir im Eingangspost NUR darum, ob man das mit Namespaces genauso macht wie mit Funktionen oder Klassen, sprich aufteilung in .hpp und .cpp und #include in den Modulen wo der Namespace gebraucht wird.


Anmelden zum Antworten