Frage Warum ist ein unbenannter Namespace eine "überlegene" Alternative zu einer statischen? [Duplikat]


Diese Frage hat hier bereits eine Antwort:

Der Abschnitt $ 7.3.1.1 / 2 aus dem C ++ Standard lautet:

Die Verwendung des Schlüsselworts static ist   veraltet, wenn Objekte in a deklariert werden   Namensraumbereich; der unbenannte Namespace   bietet eine überlegene Alternative.

Ich verstehe nicht, warum ein unbenannter Namensraum als überlegene Alternative angesehen wird. Was ist der Grund? Ich weiß seit langem, was der Standard sagt, aber ich habe nie ernsthaft darüber nachgedacht, selbst als ich auf diese Frage antwortete: Überlegenheit von unbenanntem Namespace gegenüber statischem?

Ist es überlegen, weil es auch auf benutzerdefinierte Typen angewendet werden kann, wie ich in meinem Artikel beschrieben habe Antworten? Oder gibt es noch einen anderen Grund, von dem ich nichts weiß? Ich frage das, besonders weil das meine Argumentation in meiner Antwort ist, während der Standard etwas anderes im Sinn haben könnte.


76
2018-02-12 09:04


Ursprung


Antworten:


  • Wie Sie bereits erwähnt haben, funktioniert Namespace für alles, nicht nur für Funktionen und Objekte.
  • Wie Greg darauf hingewiesen hat, static bedeutet schon zu viele Dinge.
  • Namespaces bieten eine einheitliche und konsistente Möglichkeit, die Sichtbarkeit im globalen Umfang zu kontrollieren. Sie müssen nicht verschiedene Werkzeuge für die gleiche Sache verwenden.
  • Wenn Sie einen anonymen Namespace verwenden, wird der Name der Funktion / des Objekts richtig entstellt, so dass Sie in der Symboltabelle nach dem De-Mangling etwas wie "(anonymer Namespace) :: xyz" sehen können und nicht nur "xyz" mit statischer Verknüpfung .
  • Wie in den Kommentaren unten erwähnt, ist es nicht erlaubt, statische Dinge als Template-Argumente zu verwenden, während es bei anonymen Namespaces gut ist.
  • Mehr? Wahrscheinlich, aber mir fällt gerade nichts ein.

85
2018-02-12 10:22



Ein Grund mag das sein static hat schon zu viele Bedeutungen (ich kann mindestens drei zählen). Da ein anonymer Namespace alles einschließlich Typen einkapseln kann, scheint es dem static Lösung.


9
2018-02-12 09:10



Es gibt zwei Gründe, die ich denke:

  • static hat zwei verschiedene Bedeutungen: im Klassenraum bedeutet es, dass es von der ganzen Klasse geteilt wird, während es sich bei Datei- / Funktionsumfang auf die Sichtbarkeit / Speicherung auswirkt ...
  • unbenannte Namespaces ermöglichen es, neue zu deklarieren struct, class und typedef

Eine Anmerkung, aber das Komitee rückte auf diese zurück: static wird nicht mehr als veraltet markiert n3225.


5
2018-02-12 10:23



Was auch immer die Gründe waren, die sie hatten, änderten sie ihre Meinung: http://crazycpp.wordpress.com/2011/01/18/static-keyword-is-back/


3
2018-02-12 14:06