2010-12-01 8 views
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.Ist neu C++ abwärtskompatibel

Ich habe immer noch etwas C++ Code um meine Festplatte klopfen. 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 vor kurzem mit ein wenig VC++ 2010 zu tun und fand einige Dinge, die ich funktionierte funktionieren einfach nicht, und verschiedene Nachrichten je nach Kontext, wenn ich versuchte, NULL zu verwenden. Aber in einem Teil dieses Codes habe ich NULL ohne eine Warnung verwendet.

Antwort

8

Im Allgemeinen ja ist es rückwä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.

+0

Kürzlich hatte ich einen Vorgeschmack auf "Teufel im Detail", als eine Klasse begann, einen Verschiebungskonstruktor zu benötigen, um bei Verwendung des neuen C++ korrekt zu funktionieren. Andernfalls stürzt das Programm innerhalb des C++ 0x STL-Codes ab, der neue Funktionen verwendet. –

13

Kommt drauf 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:

for(int i = 0; ...); 
i++; 

in Visual C++ 7 kompiliert, aber nicht in Visual C++ 9.

+7

Also C++ selbst ist abwärtskompatibel, aber die Compiler implementieren es nicht. – foraidt

+3

Ich verstehe nicht. Dieses Beispiel war nie gültig C++ ..... –

+0

Aber es würde in VC2003 mit Standardoptionen kompilieren. – Dialecticus

2

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

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

7

NULL ist ein Makro - verwenden Sie lieber 0 (oder nullptr in C++0x).

Nicht sicher, wie alt Ihr Code ist, aber Visual C++ v6 leidet unter Einschrä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 nicht erwarten, dass es eine riesige Menge Arbeit ist, um alten Code kompiliert zu bekommen. Ich habe einige ziemlich wichtige Ports von VC6 -> VS2005 gemacht und zum größten Teil ist es eine Sache von Stunden, nicht von Tagen. Vielleicht wird der Kulturschock nicht mehr so ​​abschreckend wirken. Wirklich, VC++ 10 ist sehr nett.

+0

nur neugierig, was ist falsch daran, NULL ein Makro zu sein? – Javier

+1

Ein anderer könnte das tun: '@undef NULL' und dann' #define NULL 1'. Dummes Beispiel, aber das ist ein Grund, warum Makros saugen. –

+0

@Javier Es könnte definiert werden als, sagen wir, '(void *) 0' statt nur 0, was bedeutet, dass Sie es nicht als allgemeiner Nullzeiger verwenden konnten. Alternativ könnte es beliebig undefiniert und neu definiert werden. –

2

Nun, ich weiß, eine Menge unserer alten VS6-Code begann Tonnen von Warnungen zu werfen, wenn wir auf VS 2005 (mit vollständigen Warnungen auf natürlich, wie jeder arbeiten sollte). Die meisten waren gute Dinge, Warnung vor potenziellen Informationsverlust, Warnung, dass einige Arten 64-Bit anstelle von 32-Bit wie alter Code könnte erwarten, etc.

Für Ihr spezifisches Beispiel von NULL, das warn ' t sogar wirklich Standard C zurück in den Tag. Jeder Compiler hatte nur eine #define dafür, die es auf 0 setzen. Heutzutage wird es allgemein als korrekter (und klar) zu just use 0 angesehen.

+0

'NULL' nicht Standard? Es stammt aus C89. Es ist sogar älter als einige C++ - Programmierer. – MSalters

+1

Nun, ich date zurück älter als das. Früher mussten wir herausfinden, was NULL war, um sicher zu gehen. Einige Compiler stellten es auf merkwürdige Dinge ein, und gelegentlich schlecht benannte Quelldateien würden es sogar neu definieren. –

2

Neuere C++ - Standards kommen, um Dinge zu klären, dann Entscheidungen treffen, welche Verwendung "korrekter" oder akzeptiert ist, so dass ich Warnungen erwarten würde. 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 auch 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.

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 bei der Unterstützung von C++ - Standards. Es wird langsam besser (und deshalb kompiliert alter Code nicht, da er nicht kompilieren sollte).

+4

Ich kann der Charakterisierung nicht zustimmen, dass MSVC bei Konformität "sehr schlecht" ist. Jedenfalls nicht mehr. –

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 wurden strenger gegenüber Nicht-Standard-Code, aber jedem standardkonformen C++ - Code in der Vergangenheit sollte noch heute kompilieren. Code, der auf nicht standardmäßigen Compiler-Features oder -Quirks beruht, funktioniert möglicherweise nicht, aber Compiler bieten normalerweise Befehlszeilenoptionen, damit sie nicht standardmäßigen Code 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 ein Implementierungsdetail enthalten, so dass es oft möglich ist, 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 in idiomatic C++ nur 0 verwendet wird.

+1

Danke für das Detail. Überall, wo ich gearbeitet habe, scheint es jedoch vorzuziehen, NULL zu 0 zu verwenden. – AlastairG

+1

Es gibt Dinge, die * seit * 98 * geändert haben. Zum Beispiel: 'auto' ist nicht länger ein Speicherklassenspezifizierer; in C++ 0x ist es äquivalent zu "var" in anderen Sprachen und macht automatische Typabzüge. – greyfade

+0

grayfade, C++ 0x ist noch nicht fertig und ist noch nicht der Standard für Compiler, daher glaube ich nicht, dass es richtig ist zu sagen, dass sich die Sprache * geändert hat. Es wird sich aber * ändern. – Wyzard

0

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

0

Sehr ähnlich zur Antwort von sharptooth gibt es Bits älteren C- und C++ - Codes, die/ZC: forScope-set benötigen (d. H. Die Konformität im For-Schleifenbereich nicht erzwingen). z.B.

int myfunc(int x, int y, int z) 
{ 
    int j; 

    for (int i=0; i <= 10; i++) 
    { 
    if (f(i) == 0) 
     break; 
    } 
    j = i; 
    for (i=0; i <= 10; i++) 
    { 
    if (g(i) == 0) 
     break; 
    } 
    if (i > j) 
    return j; 
    return i; 
} 

Diese Art der Sache ist ganz in vielen älteren Code verbreitet, wo Bytes kosten Geld und variable Wiederverwertung war alltäglich.

+0

Huh? Das sollte ohne Schalter kompilieren - es ist Standardverhalten. (Insbesondere hast du überhaupt nichts in den for scope gelegt!) –

+0

Mein schlechtes. Bearbeitete, verschobene Erklärung, wenn ich –

4

Das hängt davon ab, was Sie vergleichen.

  • Visual Studio 2010 teilweise implementiert die kommenden C++ 0x Entwurf (neuere Versionen von GCC auch eine Teilmenge dieses Entwurfs implementieren, die im nächsten Jahr standardisiert werden voraussichtlich)
  • C++ 98/C + +03 war die erste standardisierte Version von C++, und ist immer noch der offizielle (wie C++ 0x noch nur ein Entwurf ist)
  • und natürlich gibt es die Dialekte aus, bevor die Sprache standardisiert wurde

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 vor-Standard C++ ist.

Aber wahrscheinlicher ist, was Sie in ist nicht eine Frage der C++ Rückwärtskompatibilität, aber einfach, 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ültig C++, aber gearbeitet, weil Compiler früher mehr vom Standard abweichen.

0

Leicht zufällig, aber das Schlüsselwort export wird aus dem Standard entfernt. So war zuvor der standardkonforme Code export jetzt illegal. Natürlich haben sehr wenige Compiler sogar damit begonnen, dieses Keyword zu implementieren.

Verwandte Themen