Namespace privat?



  • Wenn ich ein paar freie Funktionen in einen Namespace stecken will und diese Funktionen andere zweite Funktionen aufrufen sollen, aber diese zweiten Funktionen nicht von jemand anders verwendet werden sollen, wie macht man das am besten? Kann man irgendwie sagen, dass die Funktionen nur von Funktionen im selben Namespace aufgerufen werden können?



  • Du könntest sie einfach aus dem Header rauslassen 🙂



  • Hallo,

    das geht nicht. Übliche Praktik ist, einen verschachtelten Namensbereich namens 'impl' o.ä. zu verwenden, der die „privaten“ Implementierungen enthält. Dadurch sind sie zwar genauso offen, aber der Name des Namensbereichs ist quasi ein großes Warnschild, das sagt „Pfoten weg!“



  • hiho schrieb:

    Wenn ich ein paar freie Funktionen in einen Namespace stecken will und diese Funktionen andere zweite Funktionen aufrufen sollen, aber diese zweiten Funktionen nicht von jemand anders verwendet werden sollen, wie macht man das am besten? Kann man irgendwie sagen, dass die Funktionen nur von Funktionen im selben Namespace aufgerufen werden können?

    wenn du die implementation der funktionen sauber in einer eigenen übersetzungseinheit hast (und du nicht unbedingt templates verwendest), dann könntest du diese zweiten funktionen auch in einen anonymen namespace stecken.

    //foo.h
    
    namespace foo
    {
       void bar ();
    }
    
    //foo.cc
    #include "foo.h"
    
    namespace foo
    {
       namespace
       {
          void baz () 
          {
          }
       }
    
       void bar ()
       {
          baz (); 
       }
    }
    
    //x.cc
    #include "foo.h"
    
    int main ()
    {
       //keine möglichkeit, auf baz zuzugreifen
    }
    

    Badestrand schrieb:

    Du könntest sie einfach aus dem Header rauslassen 🙂

    im gegensatz dazu kannst du mit anonymen namespaces davon ausgehen, dass garantiert keine andere übersetzungseinheit die funktion verwendet.

    bei problemen: namespace impl .



  • hiho schrieb:

    Kann man irgendwie sagen, dass die Funktionen nur von Funktionen im selben Namespace aufgerufen werden können?

    Dies geht nur in der gleichen Übersetzungseinheit und nennt sich anonymer Namensraum (namespace ohne Bezeichner).

    cu André



  • queer_boy schrieb:

    Badestrand schrieb:

    Du könntest sie einfach aus dem Header rauslassen 🙂

    im gegensatz dazu kannst du mit anonymen namespaces davon ausgehen, dass garantiert keine andere übersetzungseinheit die funktion verwendet.

    Naja, in der anderen Ü-Einheit müsste die Funktion auch noch im selben Namespace sein und oft pachtet man sie ja für sich alleine. Aber gut, ein anonymer Namespace ist die definitiv bessere Methode.


Anmelden zum Antworten