Ich habe gerade einen Teil meines eigenen Codes mit der -std=c++0x
Flagge in GCC kompiliert , da ich vage auf dem Laufenden halten möchte, was alle jungen Leute tun (vorausgesetzt, sie bleiben auf meinem Rasen), und am Ende habe ich eine Menge Warnungen erhalten über auto_ptr
veraltet zu sein. Natürlich wusste ich, dass auto_ptr
das in C ++ 0x veraltet war, aber ...
Ist Abschreibung nicht eine Verschwendung von Zeit und Mühe? Gründe für die Nichtbeachtung (am Beispiel von auto_ptr):
Es gibt eine Vielzahl von Codes, die noch unterstützt werden müssen. Millionen von Warnungen werden nur dazu verleiten, Warnungen auszuschalten.
auto_ptr
ist ein bisschen naff, aber es macht tatsächlich das, was es verspricht.Wenn wir wirklich Dinge missbilligen wollen, nominiere ich
printf()
. Aber stellen Sie sich nur das Quietschen vor, das folgen würde.auto_ptr
hat nicht zu viele Freunde, aber in meinem C ++ - Code wird es mehr als verwendetprintf
, was überhaupt nicht verwendet wird.hat der Ausschuß eine schlechte Bilanz dieses Recht zu bekommen - sie statisch auf Namespacebereich ist veraltet, und jetzt scheint es undeprecated worden zu sein - ich würde nicht überrascht sein , wenn
auto_ptr
ein ähnlichen Come-back gemachtWas auch immer das Komitee sagt, die Compiler-Implementierer ignorieren sie - sie können es einfach nicht riskieren, ihren Kundencode zu brechen, sie können nur irritierende Warnungen ausgeben.
Also meine Frage - halten Sie Verfall (von irgendetwas, nicht nur auto_ptrs und nicht nur in C ++) für eine gute Idee, und wenn ja, warum?
quelle
auto_ptr
als Beispiel.unique_ptr
und glücklicher sein.Antworten:
Gründe für die Abwertung (allgemein):
Ich bin mir auch nicht einig über den letzten Punkt. Compiler ignorieren das Komitee nicht und entfernen schließlich Dinge, die veraltet sind (z. B.
>?=
und<?=
in GCC - sie wurden veraltet und dann entfernt *).Ich denke, der wichtige Punkt ist: Einige Dinge sollten aus verschiedenen Gründen entfernt werden, und ich denke, dass Ablehnung der einzig vernünftige Weg ist, dies zu tun. In diesem speziellen Fall
auto_ptr
sollte entfernt werden, da es durch ersetzt wurdeunique_ptr
. Das Umrüsten ist einfach genug und die Leute werden viel Zeit dazu haben.(*) Ja, ich weiß, dass es sich um Erweiterungen und nicht um Standard handelt, aber der Punkt ist, dass Compiler-Anbieter eventuell Dinge entfernen, sobald sie Verfallsdatum eingeben, unabhängig davon, ob der Code noch auf ihnen basiert oder nicht.
quelle
>?=
und<?=
Operatoren?a >?= b;
wofürif (a > b) a = b;
und für was<?=
.Jede ausreichend komplizierte API weist wahrscheinlich Fehler auf, die erst entdeckt werden, nachdem sie für eine Weile verwendet wurden. Unsere Möglichkeiten:
Abschreibung ist die vernünftigste dieser Alternativen.
quelle
Nein. Abwertung kann eine wirklich gute Sache sein. Es verhindert, dass Technologien mit altem, unbrauchbarem Gepäck in Kontakt kommen.
Gerade in der C ++ - Arena erinnere ich mich an das "Feature" von Microsoft, die Variablendeklaration in einer for-Anweisung nicht korrekt zu unterstützen. Das dauerte ungefähr ein Jahrzehnt und machte eine Menge Code nicht portierbar. Das ist ein "Feature", ich bin froh, dass es veraltet war.
Im Allgemeinen hat Apple seit den 80er Jahren die Angewohnheit, klobige alte APIs 5-7 Jahre lang als "veraltet" zu markieren, bevor sie herausgezogen werden. Ich habe gerade mit einem Apple-Ingenieur bei WWDC darüber gesprochen, einige der alten QuickTime C-APIs zu verwerfen, und es hat mich sehr gefreut, dass sie dies tun, da die fortgesetzte Unterstützung für ein um 1990 entwickeltes Modell die erwarteten Möglichkeiten völlig einschränkte auf modernen 64-Bit-Multicore-CPUs zu tun.
In der Praxis wird es lange dauern, bis Compiler-Writer auto_ptr sichern, und sie werden wahrscheinlich für ein oder zwei Jahrzehnte einen Abwärtskompatibilitätsmodus unterstützen, aber es ist eine gute Sache, imo.
quelle
printf
ist eine nützliche Funktion. Es ermöglicht das Formatieren von Dingen, die kürzer sind als iostreams. Und es ist eine C-Funktion. Der eigentliche Grund, warum C ++ existiert und verwendet wird, ist, dass es mit C kompatibel istprintf
.Das Komitee ist sich einiger Probleme der gegenwärtig angenommenen Bedeutung von Abwertung bewusst. Siehe die Bedeutung von Verfall .
quelle
Sprachen und APIs müssen vorankommen. Auch wenn es je nach altem Feature eine Menge Code gibt, gibt es möglicherweise eine neue und bessere Möglichkeit, etwas zu tun, und die Kosten für die Unterstützung des alten Features sind einfach zu hoch.
Die Nichtbeachtung warnt auch davor, dass das Feature in Zukunft entfernt wird. Dies gibt Entwicklern Zeit, ihren Code zu aktualisieren, wenn sie mit der neuen API Schritt halten. Das ist viel besser als die Alternative: die vollständige Entfernung. Denken Sie daran, dass die Abschreibung eine Warnung und kein Fehler ist.
Und wenn dies ein altes Programm ist, das Sie nicht aktualisieren möchten, hindert nichts Sie daran, die alte API (oder in diesem Fall den Compiler) zu verwenden.
quelle
In der jetzigen Form hat die Abwertung mindestens zwei Bedeutungen.
Ich denke, statisch fällt in die letztere Kategorie, aber nur die Zeit wird zeigen, ob auto_ptr es wirklich verdient, entfernt zu werden, oder ob es besser ist, es in der Sprache zu belassen.
quelle
Eine Abschreibung ist nicht schädlich, wenn der Wechsel zu einer Alternative innerhalb eines Arbeitstages erfolgen kann: z. Einfaches Suchen / Ersetzen der alten Funktion durch die neue oder ein Kompatibilitätslayer ist einfach einzurichten.
Wenn Sie große Teile der Software aufgrund der veralteten Software neu schreiben müssen, ist dies schädlich.
Ein gutes Beispiel wäre wahrscheinlich die mysql-API von PHP. Im Grunde müssen Sie lediglich alle mysql_ * durch mysqli_ * ersetzen und eine Link-ID angeben, und fertig.
Ein schlechtes Beispiel ist das Veralten und Entfernen von glBegin, glEnd und allen Matrixberechnungs-Inhalten aus OpenGL. Wenn Ihr Code mit OpenGL3 oder höher arbeiten soll, müssen Sie den gesamten Rendering-Code neu schreiben, um Vertex-Puffer zu verwenden.
quelle
Ich denke, es ist eine gute Möglichkeit, die Leute wissen zu lassen, dass es einen besseren Weg gibt. Ich bevorzuge lieber eine nette Abwertung als eine Funktion, die einfach verschwindet.
quelle