Unbenannte/anonyme Namespaces vs. statische Funktionen

Lesezeit: 1 Minute

Unbenannteanonyme Namespaces vs statische Funktionen
Kopf Geek

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?

  • In C++11 ist die Verwendung von static in diesem Zusammenhang war undicht; obwohl unbenannter Namespace eine überlegene Alternative zu ist statices gibt Fälle, in denen es fehlschlägt, wenn static kommt zur Rettung.

    – legends2k

    6. Dezember 2013 um 10:54 Uhr

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

995550cookie-checkUnbenannte/anonyme Namespaces vs. statische Funktionen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy