using in Headers



  • Ich bin gerade überfolgendes gestolpert:

    // Camera.h
    #include "math/Vector3.h"
    
    using math::Vec3;
    
    class Camera {
    public:
       Vec3 eye;
    };
    
    // Sphere.h
    #include "Camera.h"
    class Sphere {
       Vec3 c;  // Darum gehts
    }:
    

    Ich war zunächst erstaunt, dass dieser Code kompiliert, obwohl ich nicht math::Vec3 c; geschrieben habe, sondern nur Vec3 c; Der Grund ist wohl, dass ich das using math::Vec3 in Camera.h habe und das dann auch in Sphere.h gilt.

    Jetzt frage ich mich: Ist so ein using Namespace::TypXY; überhaupt gut in einem Header? Weil eigentlich möchte ich NICHT, dass Vec3 in Sphere.h automatisch aufgelöst wird. Sollte ich in Headern die Namespaces immer ausschreiben und die usings nur in .cpp nutzen?



  • Nein!!!!!!!!

    Niemals using in Header verwenden. Denn es gilt nich nur für die cpp, sonder für jeden Quelltext in welchen du die h includest.



  • ooppl schrieb:

    Ich bin gerade überfolgendes gestolpert:

    // Camera.h
    #include "math/Vector3.h"
    
    using math::Vec3;
    
    class Camera {
    public:
       Vec3 eye;
    };
    
    // Sphere.h
    #include "Camera.h"
    class Sphere {
       Vec3 c;  // Darum gehts
    }:
    

    Ich war zunächst erstaunt, dass dieser Code kompiliert, obwohl ich nicht math::Vec3 c; geschrieben habe, sondern nur Vec3 c; Der Grund ist wohl, dass ich das using math::Vec3 in Camera.h habe und das dann auch in Sphere.h gilt.

    Jetzt frage ich mich: Ist so ein using Namespace::TypXY; überhaupt gut in einem Header? Weil eigentlich möchte ich NICHT, dass Vec3 in Sphere.h automatisch aufgelöst wird. Sollte ich in Headern die Namespaces immer ausschreiben und die usings nur in .cpp nutzen?

    Man vermeidet using in Headern, da es den Sinn von Namespaces, wie du ja siehst, vollkommen zerstört.


  • Administrator

    ooppl schrieb:

    Sollte ich in Headern die Namespaces immer ausschreiben und die usings nur in .cpp nutzen?

    Sehr richtig!

    Und ich gratuliere, du bist einer der ersten seit langem, welcher dies wieder mal selber erkannt hat. Das gibt einem Hoffnung 🤡 😃

    Grüssli



  • Hehe. Vielleicht ist ja doch noch nicht Hopfen & Malz bei mir verloren^^

    Dann habe ich noch 2 kleine Frage. Sagen wir ich habe den Namespace Main::Math:

    // Vector.h
    namespace Main {
    
    namespace Math
    
    class Vector { ... };
    
    }
    

    und den will ich jetzt in der Datei Foo.cpp nutzen:

    // Foo.cpp (CPP Datei!)
    namespace Main {
    
    namespace Scene
    
    Foo::method() {
    
    }
    
    }
    

    Meine 2 Fragen:
    Wenn ich das "using namespace" irgendwo in den Block von "namespace Main" schreibe, reicht ja offenbar ein "using namespace Math" (statt using namespace Main::Math"). Ist diese Kurzform "böse" oder ist das ok?

    Spielt es eine Rolle, wo ich das using namespace hinschreibe? Also sollte ich "using namespace Math" in den Main Block, oder Scene Block oder global?

    Danke 🙂


  • Administrator

    ooppl schrieb:

    Wenn ich das "using namespace" irgendwo in den Block von "namespace Main" schreibe, reicht ja offenbar ein "using namespace Math" (statt using namespace Main::Math"). Ist diese Kurzform "böse" oder ist das ok?

    Daran ist grundsätzlich nichts böses. Der Namensraum Math wird dann halt einfach im Namensraum Main ausgeleert. Der Namensraum Math wird auch gefunden, da er sich schliesslich im Namensraum Main befindet.

    ooppl schrieb:

    Spielt es eine Rolle, wo ich das using namespace hinschreibe? Also sollte ich "using namespace Math" in den Main Block, oder Scene Block oder global?

    Ja, es spielt eine Rolle. Dort wo du ein using namespace machst, wird der Namensraum auch ausgeleert. Ich persönlich ziehe deshalb immer den am meistens qualifizierten Bereich vor und schreibe ein using namespace fast nur im Funktionsblock und dort zum Teil sogar in einem eigenen Block.

    Ganz selten leere ich einen Namensraum im globalen Namensraum aus.

    Sowas gehört aber etwas zum Codestil und ist daher auch Geschmacksache.

    Grüssli



  • Dravere schrieb:

    ooppl schrieb:

    Wenn ich das "using namespace" irgendwo in den Block von "namespace Main" schreibe, reicht ja offenbar ein "using namespace Math" (statt using namespace Main::Math"). Ist diese Kurzform "böse" oder ist das ok?

    Daran ist grundsätzlich nichts böses. Der Namensraum Math wird dann halt einfach im Namensraum Main ausgeleert. Der Namensraum Math wird auch gefunden, da er sich schliesslich im Namensraum Main befindet.

    ooppl schrieb:

    Spielt es eine Rolle, wo ich das using namespace hinschreibe? Also sollte ich "using namespace Math" in den Main Block, oder Scene Block oder global?

    Ja, es spielt eine Rolle. Dort wo du ein using namespace machst, wird der Namensraum auch ausgeleert. Ich persönlich ziehe deshalb immer den am meistens qualifizierten Bereich vor und schreibe ein using namespace fast nur im Funktionsblock und dort zum Teil sogar in einem eigenen Block.

    Ganz selten leere ich einen Namensraum im globalen Namensraum aus.

    Sowas gehört aber etwas zum Codestil und ist daher auch Geschmacksache.

    Grüssli

    Und in China ist ein Sack umgefallen!



  • Anscheinend möchte ooppl keine Ratschläge mehr.


Anmelden zum Antworten