Eine Funktion von C++ ist die Möglichkeit, unbenannte (anonyme) Namespaces zu erstellen, etwa so:
namespace {
int cannotAccessOutsideThisFile() { ... }
} // namespace
Sie würden denken, dass eine solche Funktion nutzlos wäre – da Sie den Namen des Namensraums nicht angeben können, ist es unmöglich, von außen auf irgendetwas darin zuzugreifen. Aber diese unbenannten Namespaces sind innerhalb der Datei, in der sie erstellt wurden, zugänglich, als ob Sie eine implizite using-Klausel für sie hätten.
Meine Frage ist, warum oder wann wäre dies der Verwendung statischer Funktionen vorzuziehen? Oder sind sie im Wesentlichen zwei Möglichkeiten, genau dasselbe zu tun?
Der C++ Standard liest in Abschnitt 7.3.1.1 Unbenannte Namensräume, Absatz 2:
Die Verwendung des Schlüsselworts static wird beim Deklarieren von Objekten in einem Namespace-Bereich abgelehnt, der unnamed-namespace bietet eine bessere Alternative.
Static gilt nur für Namen von Objekten, Funktionen und anonymen Vereinigungen, nicht für Typdeklarationen.
Bearbeiten:
Die Entscheidung, diese Verwendung des static
Schlüsselwort (das die Sichtbarkeit einer Variablendeklaration in einer Übersetzungseinheit beeinflusst) wurde rückgängig gemacht (Ref). In diesem Fall mit a static
oder ein unbenannter namespace
sind wieder im Wesentlichen zwei Möglichkeiten, genau dasselbe zu tun. Weitere Diskussionen finden Sie in dieser SO-Frage.
Unbenannt namespace
haben immer noch den Vorteil, dass Sie Übersetzungseinheiten-lokale Typen definieren können. Weitere Einzelheiten finden Sie in dieser SO-Frage.
Dank geht an Mike Percy, der mich darauf aufmerksam gemacht hat.
In C++11 ist die Verwendung von
static
in diesem Zusammenhang war undicht; obwohl unbenannter Namespace eine überlegene Alternative zu iststatic
es gibt Fälle, in denen es fehlschlägt, wennstatic
kommt zur Rettung.– legends2k
6. Dezember 2013 um 10:54 Uhr