Gibt es einen Unterschied zwischen dem Umschließen von Header- und CPP-Dateiinhalten in einen Namespace oder dem Umschließen nur des Headerinhalts und dem anschließenden Verwenden des Namespace in der CPP-Datei?
Mit Unterschied meine ich jede Art von Leistungseinbußen oder leicht abweichenden Semantiken, die Probleme verursachen können oder alles, was ich beachten muss.
Beispiel:
// header
namespace X
{
class Foo
{
public:
void TheFunc();
};
}
// cpp
namespace X
{
void Foo::TheFunc()
{
return;
}
}
VS
// header
namespace X
{
class Foo
{
public:
void TheFunc();
};
}
// cpp
using namespace X;
{
void Foo::TheFunc()
{
return;
}
}
Wenn es keinen Unterschied gibt, welche Form wird bevorzugt und warum?
quelle
Es gibt keine Leistungseinbußen, da das Ergebnis das gleiche sein könnte, aber das Einfügen Ihres
Foo
Namespace führt implizit zu Mehrdeutigkeiten, falls SieFoo
s in verschiedenen Namespaces haben. Sie können Ihren Code tatsächlich fubar bekommen. Ich würde empfehlen, die Verwendungusing
für diesen Zweck zu vermeiden .Und du hast einen Streuner
{
danachusing namespace
;-)quelle
}
am Ende passt . Allerdings würde ich dieses Paar Zahnspangen als überflüssig bezeichnen;)Wenn auch der zweite kompiliert wird, sollte es keine Unterschiede geben. Namespaces werden zur Kompilierungszeit verarbeitet und sollten die Laufzeitaktionen nicht beeinflussen.
Aber für Designprobleme ist der zweite schrecklich. Auch wenn es kompiliert wird (nicht sicher), macht es überhaupt keinen Sinn.
quelle
{
;-)Foo :: TheFunc () befindet sich im VS-Fall nicht im richtigen Namespace. Verwenden Sie 'void X :: Foo :: TheFunc () {}', um die Funktion im richtigen Namespace (X) zu implementieren.
quelle
Wenn Sie nur den .h-Inhalt einschließen, müssen Sie ihn mit dem Namespace ... in die cpp-Datei schreiben, andernfalls arbeiten Sie jedes Mal am gültigen Namespace. Normalerweise verpacken Sie sowohl CPP- als auch H-Dateien, da sonst das Risiko besteht, Objekte aus einem anderen Namespace zu verwenden, was zu vielen Problemen führen kann.
quelle
Ich denke, das Richtige hier ist, den Namespace für das Scoping zu verwenden.
quelle
Wenn Sie versuchen, Variablen von einer zur anderen zu verwenden, würde ich empfehlen, sie zu externalisieren und dann wie folgt in der Quelldatei zu initialisieren:
quelle