Antworten:
Sie beziehen sich grundsätzlich auf den Abschnitt §7.3.1.1 / 2 aus dem C ++ 03 Standard,
Die Verwendung des statischen Schlüsselworts ist veraltet, wenn Objekte in einem Namespace-Bereich deklariert werden. Der unbenannte Namespace bietet eine überlegene Alternative.
Beachten Sie, dass dieser Absatz bereits in C ++ 11 entfernt wurde. static
Funktionen sind standardmäßig nicht mehr veraltet!
Unbenannte Namespaces sind dem statischen Schlüsselwort jedoch überlegen, vor allem, weil das Schlüsselwort static
nur für die Variablendeklarationen und -funktionen gilt, nicht für die benutzerdefinierten Typen .
Der folgende Code ist in C ++ gültig
//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
Dieser Code ist jedoch NICHT gültig:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
Die Lösung lautet also: Unbenannter Namespace.
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
Hoffe es erklärt, warum warum unnamed-namespace
überlegen ist static
.
Beachten Sie außerdem, dass die Verwendung des statischen Schlüsselworts beim Deklarieren von Objekten in einem Namespace-Bereich (gemäß Standard) veraltet ist.
deprecated
bemerkt hat, wurde diese Bemerkung anscheinend aus der neuesten C ++ 0x FCD (n3225) entfernt.
.cpp
definieren eine Klasse mit demselben Namen.
Damit ist ein interessantes Problem verbunden:
Angenommen, Sie verwenden ein static
Schlüsselwort oder einen Namen ohne Namen namespace
, um eine Funktion innerhalb des Moduls (Übersetzungseinheit) zu erstellen, da diese Funktion vom Modul intern verwendet werden soll und außerhalb des Moduls nicht zugänglich ist. (Unbenannte namespace
s haben den Vorteil, dass neben Funktionen auch Daten- und Typdefinitionen intern sind).
Mit der Zeit wird die Quelldatei der Implementierung Ihres Moduls größer, und Sie möchten sie in mehrere separate Quelldateien aufteilen, um den Code besser zu organisieren, die Definitionen schneller zu finden und unabhängig zu kompilieren.
Aber jetzt haben Sie ein Problem: Diese Funktionen können sich nicht mehr static
auf das Modul static
beziehen , da sie sich nicht auf das Modul beziehen , sondern auf die Quelldatei (Übersetzungseinheit). Sie müssen sie nicht aktivieren static
, damit von anderen Teilen (Objektdateien) dieses Moduls auf sie zugegriffen werden kann. Dies bedeutet aber auch, dass sie für das Modul nicht mehr verborgen / privat sind: Durch die externe Verknüpfung können sie von anderen Modulen aus aufgerufen werden, was nicht Ihre ursprüngliche Absicht war.
Unbenannt namespace
würde dieses Problem auch nicht lösen, da es auch für eine bestimmte Quelldatei (Übersetzungseinheit) definiert ist und von außen nicht zugänglich ist.
Es wäre toll , wenn man angeben könnte , dass einige namespace
ist private
, das heißt, was in ihm definiert ist, verwendet werden soll intern vom Modul zu ihm gehört. Aber natürlich hat C ++ kein Konzept wie "Module", sondern nur "Übersetzungseinheiten", die eng an die Quelldateien gebunden sind.
Der C ++ Standard liest in Abschnitt 7.3.1.1 Unbenannte Namespaces, Absatz 2:
Die Verwendung des statischen Schlüsselworts ist veraltet, wenn Objekte in einem Namespace-Bereich deklariert werden. Der unbenannte Namespace bietet eine überlegene Alternative.
Statisch gilt nur für Namen von Objekten, Funktionen und anonymen Vereinigungen, nicht für Typdeklarationen.
static
funktionieren.