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.
-
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

-
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
Mathwird dann halt einfach im NamensraumMainausgeleert. Der NamensraumMathwird auch gefunden, da er sich schliesslich im NamensraumMainbefindet.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 namespacemachst, wird der Namensraum auch ausgeleert. Ich persönlich ziehe deshalb immer den am meistens qualifizierten Bereich vor und schreibe einusing namespacefast 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
Mathwird dann halt einfach im NamensraumMainausgeleert. Der NamensraumMathwird auch gefunden, da er sich schliesslich im NamensraumMainbefindet.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 namespacemachst, wird der Namensraum auch ausgeleert. Ich persönlich ziehe deshalb immer den am meistens qualifizierten Bereich vor und schreibe einusing namespacefast 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.