In C ++ ist es möglich, das static
Schlüsselwort innerhalb einer Übersetzungseinheit zu verwenden, um die Sichtbarkeit eines Symbols (entweder Variablen- oder Funktionsdeklaration) zu beeinflussen.
In n3092 war dies veraltet:
Anhang D.2 [depl.static]
Die Verwendung des statischen Schlüsselworts ist veraltet, wenn Objekte im Namespace-Bereich deklariert werden (siehe 3.3.6).
In n3225 wurde dies entfernt.
Der einzige Artikel, den ich finden konnte, ist etwas informell.
Es wird jedoch unterstrichen, dass aus Gründen der Kompatibilität mit C (und der Fähigkeit, C-Programme als C ++ zu kompilieren) die Ablehnung ärgerlich ist. Das direkte Kompilieren eines C-Programms als C ++ kann jedoch bereits eine frustrierende Erfahrung sein, daher bin ich mir nicht sicher, ob dies eine Überlegung erfordert.
Weiß jemand, warum es geändert wurde?
Antworten:
In C ++ Standard Core Language-Fehlerberichten und akzeptierten Problemen, Revision 94 unter 1012. Nicht veraltete statische `sie beachten:
Grundsätzlich zu sagen, dass die Abwertung von
static
nicht wirklich Sinn macht. Es wird niemals aus C ++ entfernt und ist dennoch nützlich, da Sie nicht den Boilerplate-Code benötigen, den Sie für unbenannte Namespaces benötigen, wenn Sie nur eine Funktion oder ein Objekt mit interner Verknüpfung deklarieren möchten.quelle
static class ...
, OTOH, wird nicht funktionieren.namespace {
" und "}
"?Ich werde versuchen , Ihre Frage zu beantworten, obwohl es sich um eine alte Frage ist, und es sieht nicht sehr wichtig (es ist wirklich nicht sehr wichtig , in sich selbst ), und es hat schon recht gute Antworten erhalten. Der Grund, warum ich darauf antworten möchte, ist, dass es sich um grundlegende Fragen der Standardentwicklung und des Sprachdesigns handelt, wenn die Sprache auf einer vorhandenen Sprache basiert: Wann sollten Sprachfunktionen auf inkompatible Weise veraltet, entfernt oder geändert werden?
Die Verknüpfung eigentlich.
Die Abschreibung zeigt an:
Letzterer Punkt ist wichtig. Obwohl es nie ein formelles Versprechen gibt, dass Ihr Programm nach dem nächsten Standard nicht manchmal stillschweigend gebrochen wird, sollte das Komitee versuchen, zu vermeiden, dass "vernünftiger" Code gebrochen wird. Die Ablehnung sollte Programmierern mitteilen, dass es nicht zumutbar ist, sich auf eine Funktion zu verlassen .
Insbesondere für Header-Dateien ist es sehr wichtig, eine gemeinsame C / C ++ - Teilmenge beizubehalten.
static
Globale Deklarationen sind natürlich Symboldeklarationen mit interner Verknüpfung, was in einer Header-Datei nicht sehr nützlich ist.Das Problem ist jedoch nie nur die Kompatibilität mit C, sondern auch die Kompatibilität mit vorhandenem C ++: Es gibt Unmengen vorhandener gültiger C ++ - Programme, die
static
globale Deklarationen verwenden. Dieser Code ist nicht nur formal legal, er ist auch solide, da er eine genau definierte Sprachfunktion verwendet , wie sie verwendet werden soll .Nur weil es jetzt (nach Ansicht einiger) einen "besseren Weg" gibt, etwas zu tun, werden die auf die alte Weise geschriebenen Programme nicht "schlecht" oder "unvernünftig". Die Fähigkeit, das
static
Schlüsselwort für Deklarationen von Objekten und Funktionen im globalen Bereich zu verwenden, ist sowohl in C- als auch in C ++ - Communitys gut bekannt und wird am häufigsten korrekt verwendet.In ähnlicher Weise, ich werde ändern C-Casts nicht
double
auf ,static_cast<double>
nur weil „C-Casts sind schlecht“, sostatic_cast<double>
fügen Null Information und null Sicherheit.Die Idee, dass alle Programmierer sich beeilen würden, ihren vorhandenen, genau definierten Arbeitscode neu zu schreiben, wenn eine neue Art erfunden wird, etwas zu tun, ist einfach verrückt. Wenn Sie alle ererbten Probleme und Probleme beseitigen möchten, ändern Sie C ++ nicht, sondern erfinden eine neue Programmiersprache. Das halbe Entfernen einer Verwendung von
static
macht C ++ kaum weniger C-hässlich.Codeänderungen müssen begründet werden, und "alt ist schlecht" ist niemals eine Rechtfertigung für Codeänderungen.
Brechende Sprachänderungen bedürfen einer sehr starken Begründung. Die Sprache etwas einfacher zu machen, ist niemals eine Rechtfertigung für eine bahnbrechende Veränderung.
Die Gründe, warum dies
static
schlecht ist, sind nur bemerkenswert schwach, und es ist nicht einmal klar, warum nicht sowohl Objekte als auch Funktionsdeklarationen zusammen veraltet sind. Eine unterschiedliche Behandlung macht C ++ kaum einfacher oder orthogonaler.Es ist also wirklich eine traurige Geschichte. Nicht wegen der praktischen Konsequenzen, die es hatte: Es hatte genau null praktische Konsequenzen. Aber weil es einen klaren Mangel an gesundem Menschenverstand seitens des ISO-Komitees zeigt.
quelle
static
oder anonyme Namespaces verwenden, ich ermutige oder entmutige auch nicht. Mein Punkt ist, dass, wenn Sie Leute wirklich davon abhalten wollen, anonyme Namespaces zu verwenden, Sie ihnen gute Argumente geben müssen. In der Praxis glaube ich, dass in den meisten Implementierungen Entitäten, die in einem unbenannten Namespace deklariert sind, Symbole sind, die mit einem zufälligen Namen exportiert werden, wodurch die Exporttabelle vergrößert wird. Alsstatic
OTOH deklarierte Unternehmen werden in keiner Weise exportiert. Daher entscheiden sich viele Menschen aufgrund dieser Beobachtung für die Verwendungstatic
.static
niemals verschwinden wird, daher ist es falsch, ihn zu verwerfen. " Sie machen jedoch kein Argument dafür, dass es falsch ist, von seiner Verwendung abzuraten. " Ich habe kein überzeugendes Argument gesehen, das zeigt, dass die Verwendung des Namespace-Bereichsstatic
"falsch" ist. Es zu verachten, nur um von seiner Verwendung abzuraten, ist falsch, weil niemand wirklich glaubt, dass es verschwinden wird, und weil es die Leute nicht davon überzeugt, dass es "falsch" ist.Veraltet oder nicht, das Entfernen dieser Sprachfunktion würde vorhandene Codes beschädigen und Menschen ärgern.
Die ganze Sache mit der statischen Abwertung war nur Wunschdenken im Sinne von "anonyme Namespaces sind besser als statische" und "Referenzen sind bessere Zeiger". Lol.
quelle
char* foo = new char; char& ref = *foo;
Nur weil Sie einen Zeiger erhalten, sagt dies zunächst nichts über Ihre Fähigkeit aus, Referenzen zu verwenden.