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?
In C ++ ist es möglich, das statische Schlüsselwort innerhalb einer Übersetzungseinheit zu verwenden, um die Sichtbarkeit eines Symbols (entweder Variablen- oder Funktionsdeklaration) zu beeinflussen.
Die Verknüpfung eigentlich.
In n3092 war dies veraltet:
Die Abschreibung zeigt an:
- Die Absicht , einige Funktionen in Zukunft zu entfernen; Dies bedeutet nicht, dass veraltete Features in der nächsten Standardrevision entfernt werden oder dass sie "bald" oder überhaupt entfernt werden müssen. Nicht veraltete Funktionen können in der nächsten Standardversion entfernt werden.
- Ein formeller Versuch, von seiner Verwendung abzuraten .
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 .
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.
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“, so static_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.