Frage

Ich bin zu alten Stil C verwendet und und haben erst vor kurzem begonnen c99 Features zu erkunden. Ich habe nur eine Frage: Wird mein Programm Kompilierung erfolgreich, wenn ich c99 in meinem Programm verwenden, das c99 Flagge mit gcc und verknüpft es mit früheren c99 Bibliotheken

?

Also, sollte ich zu alt C89-Stick oder Evolve?

War es hilfreich?

Lösung

Ich glaube, dass sie in dieser Hinsicht kompatibel sind. Dass, solange das Zeug ist, dass Sie gegen die Sourcen Schritt nicht auf einen der neuen Leckereien. Zum Beispiel, wenn der alte Code enthält enum bool { false, true }; dann sind Sie in Schwierigkeiten. Als ähnliche Dinosaurier, bin ich langsam umarmen die wunderbare neue Welt der C99. Immerhin hat es nur dort gewesen etwa 10 Jahre lauert jetzt;)

Andere Tipps

Sie sollten sich entwickeln. Danke fürs Zuhören: -)

Eigentlich werde ich auf, dass erweitern.

Du hast Recht, dass C99 wurde für eine ganze Weile schon. Sie sollte (meiner Meinung nach) für alles, was Standard wird unter Verwendung von anderen als Legacy-Code (wo man nur Fehler zu beheben, anstatt neue Funktionen hinzufügen). Es ist wahrscheinlich nicht wert für die Code-Erbe, aber Sie sollten (wie bei allen Geschäftsentscheidungen) tun Sie Ihre eigenen Kosten / Nutzen-Analyse.

ich meinen neuen Code bereits gewährleistet ist kompatibel mit C1x -., Während ich nicht den neuen Funktionen noch mit, ich versuche sicherzustellen, dass es nicht brechen

In Bezug auf Code, was zu achten ist, nehmen die Autoren der Standards Abwärtskompatibilität sehr ernst. Ihre Aufgabe war es nicht immer eine neue Sprache zu entwerfen, war es bestehende Praktiken kodifizieren.

Die Phase sie in sind im Moment erlaubt es ihnen etwas mehr Spielraum in die Sprache zu aktualisieren, aber sie immer noch dem hippokratischen Eid in ihrer Ausgabe folgen. „Vor allem nicht schaden“

Im Allgemeinen, wenn Sie Ihr Code mit einem neuen Standard gebrochen wird, wird der Compiler gezwungen, Ihnen zu sagen. So einfach Ihre Codebasis Kompilieren wird ein hervorragender Start sein. Wenn Sie jedoch, lesen Sie die C99 Begründung Dokument , werden Sie den Begriff „ruhig ändern“ erscheinen sehen -. das ist, was Sie achten müssen

Dies sind Verhaltensänderungen in den Compiler, dass Sie nicht über werden müssen informiert und kann die Quelle von viel Angst und Zähneknirschen, wenn Ihre Anwendung beginnt seltsam wirken. Sorgen Sie sich nicht um die „stille Veränderung in c89“ Bits -. Wenn sie eine problerm wäre, hätte man bereits von ihnen gebissen worden

Dieses Dokument, nebenbei bemerkt, ist eine hervorragende Lese zu verstehen, warum der tatsächliche Standard sagt, was es sagt.

respekt. Probieren Sie es aus und finden Sie heraus :-)

Obwohl, bedenken Sie, dass selbst wenn Sie ein paar Minior Kompilieren Unterschiede reparieren müssen, bewegen sich ist es wohl wert.

Wenn Sie nicht verletzen die expliziten C99-Funktionen, ein C90-Code wird mit einer anderen Stand c99 Bibliotheken Fein c99 Flagge arbeiten.

Aber es gibt einige DOS-basierten Bibliotheken in C89 wie ,, das wird sicherlich nicht funktionieren.

C99 ist sehr flexibel, so fühlen sich frei zu migrieren: -)

Die Aufrufkonventionen zwischen C-Bibliotheken nicht in Zeit stark verändert, und in der Tat, ich bin nicht sicher, ob es überhaupt hat.

Betriebssysteme an dieser Stelle verlassen sich stark auf die C-Aufrufkonventionen, da die C-APIs sind in der Regel der Klebstoff zwischen den Stücken des OS sein.

Also, im Grunde die Antwort „Ja, die Binärdateien abwärtskompatibel. Nein, natürlich, Code C99 unter Verwendung von Funktionen kann später nicht mit einem Nicht-C99-Compiler kompiliert werden.“

Es soll abwärtskompatibel sein. Es formalisiert Erweiterungen, dass viele Anbieter bereits umgesetzt haben. Es ist möglich, vielleicht sogar wahrscheinlich, dass ein gut geschriebenes Programm wird keine Probleme haben, wenn sie mit C99 kompilieren.

Nach meiner Erfahrung einige Module neu zu kompilieren und andere nicht, Zeit zu sparen ... verschwendet viel Zeit. Normalerweise gibt es einige leicht Detail übersehen, die den neuen Compiler muss es kompatibel zu machen.

Es gibt einige Teile der C89 Norm, die mehrdeutig geschrieben werden, und je nachdem, wie man interpretiert die Regel über die Arten von Zeigern und den Objekten, die sie zugreifst, der Standard als betracht kann eine von zwei sehr verschiedenen Sprachen beschreiben --one von denen semantisch viel leistungsfähiger und somit verwendbar in einem breiteren Spektrum von Feldern und von denen ermöglicht mehr Möglichkeiten für die Compiler-basierte Optimierung. Der C99 Standard „geklärt“ die Regel klar zu machen, dass es keine Mühe, um Mandat Kompatibilität mit der ehemaligen Sprache macht, obwohl sie überwiegend in vielen Bereichen begünstigt wurden; es auch behandelt, wie einige Dinge nicht definiert, die in C89 definiert wurden, aber nur, weil die C89 Regeln waren nicht genau genug geschrieben, um sie zu verbieten (zum Beispiel der Verwendung von memcpy für Typen punning in Fällen, in denen das Ziel Heap Dauer hat).

C99 kann somit mit der Sprache kompatibel sein, dass seine Autoren gedacht wurde von C89 beschrieben, ist aber nicht kompatibel mit der Sprache, die von den meisten C89-Compiler in den 1990er Jahren verarbeitet wurde.

Einige C89-Funktionen sind nicht gültig C99

Argumentieren, existieren diese Merkmale nur aus historischen Gründen und sollen nicht in der modernen C89-Code verwendet werden, aber es gibt sie.

Der C99 N1256 Standardentwurf Vorwort Absatz 5 vergleicht C99 zu älteren Versionen und ist ein guter Ausgangspunkt für die Inkompatibilitäten der Suche, auch wenn es bei weitem mehr Erweiterungen als Einschränkungen hat.

Implizite int Rückkehr und Variablentypen

Erwähnt von Lutz in einem Kommentar, z.B. Folgendes gelten C89:

static i;
f() { return 1; }

aber nicht C99, in dem Sie zu schreiben:

static int i;
int f() { return 1; }

Dies schließt auch Funktionen ohne Prototypen in C99 Aufruf: Sind Prototypen für alle Funktionen in C89, C90 oder C99 erforderlich?

n1256 sagt:

  

entfernen impliziten int

Zurück ohne Ausdruck für nicht leer Funktion

Gültig C89, C99 ungültig:

int f() { return; }

Ich denke, in C89 es gibt eine Implementierung definierten Wert. n1256 sagt:

  

Rückkehr ohne Ausdruck nicht zulässig in Funktion, dass die Renditen ein Wert

Integer-Division mit negativen Operanden

  • C89: Runden auf eine Implementierung definiert Richtung
  • C99: Runden auf 0

Also, wenn Ihr Compiler -inf gerundet, und man verließ sich auf diese Implementierung definiertes Verhalten, Ihr Compiler nun gezwungen ist, den Code auf C99 zu brechen.

https://stackoverflow.com/a/3604984/895245

n1256 sagt:

  

zuverlässige Integer-Division

Windows-Kompatibilität

Eine große praktische Bedeutung ist die Möglichkeit, in Windows zu kompilieren, da Microsoft tut nicht die Absicht, bald vollständig zu C99 zu implementieren.

Dies ist zum Beispiel, warum libgit2 Grenzen zulässig C99 verfügt über .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top