Ich habe seit Jahren nicht in C ++ codiert. Ich habe kürzlich entdeckt, dass es sich in diesen Jahren dramatisch verändert hat. Ich bin mir nicht sicher, ob ich die Änderungen mag, aber das ist eine andere Diskussion.
Ich habe immer noch C ++ Code, der um meine Festplatte klopft. Wenn ich es herausbekommen habe und es mit einem netten neuen C ++ - Compiler zu kompilieren versuchte, sagen wir die neueste Version von g ++, würde es kompilieren? Ohne Warnungen (vorausgesetzt, es wurde ohne vorherige Warnungen kompiliert)?
Ich habe kürzlich mit ein wenig VC ++ 2010 herumgespielt und einige Dinge gefunden, von denen ich erwartet habe, dass sie einfach nicht funktionieren, und verschiedene Nachrichten bekommen, abhängig vom Kontext, als ich versuchte, NULL zu benutzen. Aber in einem Teil dieses Codes habe ich NULL ohne eine Warnung verwendet.
Im Allgemeinen ist es abwärtskompatibel. Der Teufel steckt jedoch im Detail. Sie werden wahrscheinlich Dinge finden, bei denen sich Konventionen ändern oder bestimmte Bibliotheken in oder außer Gebrauch geraten.
Es kommt darauf an. In der Regel sind neuere Compiler standardkonformer, so dass viele Konstrukte, die auf früheren Compilern kompiliert wurden, jetzt nicht kompiliert werden, ohne dass sie repariert werden. Zum Beispiel:
%Vor%in Visual C ++ 7 kompiliert, aber nicht in Visual C ++ 9.
NULL ist ein Makro - verwenden Sie lieber 0 (oder nullptr in C ++ 0x ).
Sie wissen nicht genau, wie alt Ihr Code ist, aber Visual C ++ v6 leidet unter Beschränkungen, die zu Code führen, der auf neueren Compilern einfach nicht kompiliert wird. VS2005 und höher sind viel besser (im Sinne von korrekterem gegenüber dem zeitgleichen C ++ - Standard).
Ich würde allerdings nicht erwarten, dass es sehr viel Arbeit kostet, alten Code zu kompilieren. Ich habe einige ziemlich wichtige Ports von VC6 gemacht - & gt; VS2005 und zum größten Teil ist es eine Frage von Stunden, nicht von Tagen. Vielleicht wird der Kulturschock nicht mehr so abschreckend wirken. Wirklich, VC ++ 10 ist sehr nett.
Das hängt davon ab, was Sie vergleichen.
C ++ 0x ist mit C ++ 03/98 ziemlich abwärtskompatibel. Es mag ein paar obskure Eckfälle geben, die sich geändert haben, aber Sie werden ihnen wahrscheinlich nicht begegnen. Es gab jedoch viele Änderungen, wenn die Sprache zuerst standardisiert wurde, was bedeutet, dass C ++ 98 nicht vollständig (aber fast) kompatibel mit dem Standard-C ++ ist.
Aber wahrscheinlicher ist, dass Sie keine C ++ - Abwärtskompatibilität haben, sondern dass Compiler strenger geworden sind. Sie sind dem Standard viel besser geworden und erlauben nicht mehr viele nicht-standardmäßige Tricks, die früher üblich waren. Höchstwahrscheinlich war Ihr alter Code nie gültiges C ++, aber er funktionierte, weil Compiler früher mehr vom Standard abwichen.
Die Sprache selbst hat sich seit ihrer Standardisierung im Jahr 1998 nicht geändert. Die Redewendungen haben sich geändert, und die Compiler haben ihre Unterstützung für den Standard verbessert und sind gegenüber Nicht-Standard-Code strenger geworden, aber jedem standardkonformen C ++ - Code, der kompiliert wurde Die Vergangenheit sollte noch heute kompilieren. Code, der auf nicht standardmäßigen Compiler-Features oder -Merken beruht, funktioniert möglicherweise nicht, aber Compiler bieten normalerweise Befehlszeilenoptionen, um sie dazu zu bringen, nicht standardmäßigen Code zu akzeptieren, der früher von früheren Versionen desselben Compilers akzeptiert wurde.
NULL ist ein Makro, das in <cstddef>
definiert ist. Andere Standardheader können diesen Header als Implementierungsdetail enthalten. Daher ist es oft möglich, NULL zu verwenden, ohne <cstddef>
explizit einzubeziehen, aber darauf zu vertrauen, war immer nicht portabel. Es ist in Ordnung, NULL zu verwenden, solange Sie seinen Header einschließen, obwohl nur 0 in idiomatic C ++ verwendet wird.
Neuere C ++ - Standards kommen, um Dinge zu klären, dann nehmen Sie Entscheidungen darüber, welche Verwendung "korrekter" oder akzeptierter ist, also würde ich Warnungen erwarten. Einige andere Entscheidungen ändern, was getan werden kann oder nicht, also erwarte ich auch Fehler. Ich bin auf die gleiche Situation gestoßen, und ich musste den Code für die Kompilierung optimieren. Es war keine große Sache, aber das berücksichtigte meine Kenntnisse von C ++. Im Allgemeinen sollten Sie keine großen Probleme haben.
Es gibt noch andere Dinge. Zum Beispiel haben nicht alle Compiler die gesamten Regeln des C ++ Standards implementiert, oder sie hatten Bugs. Wenn Sie mit einem Compiler verwendet werden, können einige dieser Fehler oder fehlenden Features für Ihren Compiler unbemerkt bleiben, aber in zukünftigen Versionen desselben Compilers können Fehler auftreten.
Das ist der Hauptgrund, warum wir Standards haben. Sie müssen sich keine Gedanken über die Kompatibilität machen, Sie werden dem Compiler nur sagen, dass er den Code als C ++ 98 (oder 2003) kompilieren soll.
MSVC ist leider sehr schlecht darin, C ++ - Standards zu unterstützen. Es wird langsam besser (und deshalb kompiliert alter Code nicht, da er nicht kompilieren sollte).
Nun, ich weiß, dass eine Menge unseres alten VS6-Codes begonnen hat, Tonnen von Warnungen zu werfen, als wir auf VS 2005 umgerüstet haben (mit vollen Warnungen natürlich, da jeder arbeiten sollte). Die meisten waren jedoch gute Dinge, die vor einem möglichen Informationsverlust warnten, und warnten, dass manche Typen 64 Bit anstelle von 32 Bit sein könnten, wie es der alte Code erwartet, usw.
Für Ihr spezifisches Beispiel von NULL war das nicht einmal wirklich Standard C am Tag. Jeder Compiler hatte nur einen #define
dafür, der ihn auf 0 gesetzt hat. Heutzutage wird es im Allgemeinen als korrekter (und klarer) zu benutze einfach 0 .
Wenn Sie alte Versionen verschiedener Bibliotheken wie Boost verwendet haben, erwarten Sie einige Probleme.
Leicht zufällig, aber das Keyword export
wird aus dem Standard entfernt. Früher war also standardkonformer Code der verwendete export
nun illegal. Natürlich haben sehr wenige Compiler sogar damit begonnen, dieses Schlüsselwort zu implementieren.
Sehr ähnlich der Antwort von sharptooth, es gibt Bits mit älterem C- und C ++ - Code, die / ZC: forScope-set benötigen (d. h. die Konformität im For-Schleifenbereich nicht erzwingen). z.B.
%Vor%Diese Art von Sache ist ziemlich üblich in viel älterem Code, wo Bytes Geld kosten und variable Wiederverwendung üblich war.
Tags und Links c++