Ist C ++ abwärtskompatibel?

8

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.

    
AlastairG 01.12.2010, 15:38
quelle

12 Antworten

8

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.

    
David Oneill 01.12.2010, 15:41
quelle
13

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.

    
sharptooth 01.12.2010 15:40
quelle
7

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.

    
Steve Townsend 01.12.2010 15:43
quelle
4

Das hängt davon ab, was Sie vergleichen.

  • Visual Studio 2010 implementiert teilweise den bevorstehenden C ++ 0x-Entwurf (die neuesten Versionen von GCC implementieren auch eine Teilmenge dieses Entwurfs, der voraussichtlich nächstes Jahr standardisiert wird)
  • C ++ 98 / C ++ 03 war die erste standardisierte Version von C ++ und ist immer noch die offizielle (da C ++ 0x immer noch nur ein Entwurf ist)
  • und natürlich gibt es die Dialekte von vor der Standardisierung der Sprache

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.

    
jalf 01.12.2010 17:59
quelle
3

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.

    
Wyzard 01.12.2010 15:50
quelle
2

Alle Versionen von C ++ sollten abwärtskompatibel sein.

Obwohl es einige ungewöhnliche Fälle geben könnte, in denen ein Problem auftreten könnte, z.B. noexcept auf Destructos in C ++ 0x (obwohl dies noch nicht entschieden wurde).

    
ronag 01.12.2010 15:42
quelle
2

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.

    
Diego Sevilla 01.12.2010 15:44
quelle
2

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).

    
Let_Me_Be 01.12.2010 15:45
quelle
2

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 .

    
T.E.D. 01.12.2010 15:44
quelle
0

Wenn Sie alte Versionen verschiedener Bibliotheken wie Boost verwendet haben, erwarten Sie einige Probleme.

    
Cheers and hth. - Alf 01.12.2010 15:58
quelle
0

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.

    
pythonic metaphor 02.12.2010 02:22
quelle
0

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.

    
Shane MacLaughlin 01.12.2010 16:30
quelle

Tags und Links