Betrachten Sie ein Paar von zwei Quelldateien: eine Schnittstellendeklarationsdatei ( *.h
oder *.hpp
) und ihre Implementierungsdatei ( *.cpp
).
Lassen Sie die *.h
Datei wie folgt aussehen:
namespace MyNamespace {
class MyClass {
public:
int foo();
};
}
Ich habe zwei verschiedene Methoden zur Verwendung von Namespaces in Quelldateien gesehen:
*.cpp
Übung 1 zeigen:
#include "MyClass.h"
using namespace MyNamespace;
int MyClass::foo() { ... }
*.cpp
Übung 2 zeigen:
#include "MyClass.h"
namespace MyNamespace {
int MyClass::foo() { ... }
}
Meine Frage: Gibt es Unterschiede zwischen diesen beiden Praktiken und wird eine als besser angesehen als die andere?
c++
namespaces
header-files
Nickolay
quelle
quelle
int MyNamespace::MyClass::foo() ...
.Antworten:
Unter dem Gesichtspunkt der Lesbarkeit von Code ist es meiner Meinung nach wahrscheinlich besser, die Methode Nr. 2 aus diesem Grund zu verwenden:
Sie können
using
mehrere Namespaces gleichzeitig sein, und jedes Objekt oder jede Funktion, die unter dieser Zeile geschrieben wird, kann zu einem dieser Namespaces gehören (mit Ausnahme von Namenskonflikten). Das Umschließen der gesamten Datei in einennamespace
Block ist expliziter und ermöglicht es Ihnen, neue Funktionen und Variablen, die zu diesem Namespace gehören, auch in der CPP-Datei zu deklarierenquelle
Am klarsten ist die Option, die Sie nicht angezeigt haben:
Es ist auch sehr ausführlich; zu viel für die meisten Menschen. Da
using namespace
es sich nach meiner Erfahrung um ein Rezept für Namenskonflikte handelt, das vermieden werden sollte, außer in sehr begrenzten Bereichen und Orten, verwende ich im Allgemeinen Ihre Nummer 2.quelle
Ja. # 1 und # 2 sind Beispiele für eine using-Direktive bzw. eine Namespace-Definition . Sie sind in diesem Fall praktisch gleich, haben aber andere Konsequenzen. Wenn Sie beispielsweise nebenan einen neuen Bezeichner einführen
MyClass::foo
, hat dieser einen anderen Gültigkeitsbereich:# 1:
# 2:
# 1 Vorteile: etwas knapper; Es ist schwieriger, versehentlich etwas
MyNamespace
unabsichtlich einzuführen . Nachteile: Möglicherweise werden vorhandene Kennungen unbeabsichtigt abgerufen.# 2 Vorteile: Klarer, dass sowohl Definitionen vorhandener Bezeichner als auch Deklarationen neuer Bezeichner gehören
MyNamespace
. Nachteile: einfacher, unbeabsichtigt Bezeichner einzuführenMyNamespace
.Eine Kritik an # 1 und # 2 ist, dass sie sich auf einen ganzen Namespace beziehen, wenn Sie sich wahrscheinlich nur um die Definition von Mitgliedern von kümmern
MyNamespace::MyClass
. Dies ist hartnäckig und kommuniziert die Absicht schlecht.Eine mögliche Alternative zu # 1 ist eine using-Deklaration, die nur die Kennung enthält, an der Sie interessiert sind:
quelle
Ich möchte auch hinzufügen, dass, wenn Sie sich aus irgendeinem Grund für die Implementierung einer Vorlagenspezialisierung in einer CPP-Datei entscheiden und sich nur darauf verlassen, dass
using namespace
Sie auf das folgende Problem stoßen:Andernfalls ist dies in Ordnung, wenn Sie die Methode Nr. 2 anwenden.
quelle
Ich möchte mit der using-Deklaration noch einen weiteren Weg hinzufügen :
Auf diese Weise ersparen Sie sich die Eingabe des Namespace-Namens, wenn die Klasse viele Funktionen hat
quelle