//
Kommentare sind nicht Teil von C89, aber in C99, main()
ohne Rückgabe eines Wertes entspricht return 0;
in C99, aber nicht so in C89. Von N1256 (pdf), 5.1.2.2.3p1:
Wenn der Rückgabetyp der Funktion
main
ein Typ ist, der mitint
kompatibel ist, entspricht eine Rückgabe vom ersten Aufruf an die Hauptfunktion dem Aufruf der Funktionexit
mit dem vonmain
zurückgegebenen Wert. Funktion als sein Argument; Das Erreichen der}
, die die Funktionmain
beendet, gibt einen Wert von 0 zurück.
Ihr Code hat also ein undefiniertes Verhalten in C89 und ein wohldefiniertes Verhalten in C99.
Theoretisch sollte es einen Unterschied geben. Die Verwendung von "//" zum Demarkieren eines Kommentars ist nicht Teil von C89. Wenn also die C89-Regeln korrekt durchgesetzt würden, würde dies einen Compiler-Fehler erzeugen (mit -ansi -pedantisch könnte es das tun, aber ich erinnere mich nicht daran) sicher).
Das gibt jedoch eine Vorstellung von dem allgemeinen Charakter: Wenn ein Programm als C89 kompiliert wird, wird es im Allgemeinen auch als C99 kompiliert und ergibt genau die gleichen Ergebnisse. C99 kauft meist einige neue Features, die in C89 nicht vorhanden sind. Sie können also (zB) Arrays variabler Länge verwenden, die in C89 nicht erlaubt sind.
Sie müssen möglicherweise um pedantische Regelerzwingung bitten, um alle Unterschiede zu sehen - C99 soll vorhandene Praxis standardisieren, und einige der vorhandenen Praxis sind gcc-Erweiterungen, von denen einige standardmäßig aktiviert sind.
in diesem Forum Ссылка habe ich folgendes gefunden:
Zusammenfassung: 99 ist standardisiert, hat neue Schlüsselwörter, neues Array-Zeug, komplexe Zahlen, Bibliotheksfunktionen und so weiter. Mehr Compiler sind komplett, da sie die ganze Zeit hatten, um sie so zu machen.
A) ANSI X3.159-1989. Dies ist der ursprüngliche 1989 C-Standard, datiert Dezember 1989, mit Begründung. Der Hauptteil der Sprache ist beschrieben in Abschnitt 3, und die "C-Bibliothek" - stdio, Funktionen und so weiter - in Abschnitt 4.
B) ISO 9899: 1990. Dies ist der ursprüngliche ISO-C-Standard. "ANSI" ist das American National Standards Institute, also die internationale Masse haben ihre eigenen Standards mit ihrer eigenen, unterschiedlichen Nummerierung zu haben System. Sie haben einfach den ANSI-Standard von 1989 übernommen und den Begründung, und nummerierte die Abschnitte (nennt sie "Klauseln" stattdessen). Mit sehr wenigen Ausnahmen können Sie einfach drei hinzufügen, so dass der größte Teil der Sprache wird im Abschnitt beschrieben - er, "clause" - 6, und der "C library" -Teil in Abschnitt 7.
C) ISO 9899: 1999. Dies ist der neue "C99" Standard mit seinen Variablenlängen-Arrays, flexible Array-Elemente, neue Schlüsselwörter wie "restrict" und "_Bool", neue Semantik für das Schlüsselwort "static", neu Syntax zum Erstellen von anonymen Aggregaten, neuen komplexen Zahlentypen, Hunderte neuer Bibliotheksfunktionen und so weiter.
Der neue ISO-Standard wurde von ANSI sofort "rückgängig gemacht". ich habe keinen offiziellen "ANSI-sanktionierten" Anspruch darauf gesehen, aber gegeben Bei den üblichen Nummerierungssystemen würde ich erwarten, dass dies der ANSI-Standard ist Nummer X3.159-1999. (Das Nummerierungssystem ist ziemlich offensichtlich: a Standard, sobald es herauskommt, bekommt eine Nummer - X. für ANSI, oder nur eine Nummer für ISO - und ein Suffix, das das Jahr angibt Veröffentlichung. Ein Update auf einen bestehenden Standard wiederverwendet die Nummer mit das neue Jahr.)
Obwohl X3.159-1989 und 9899: 1990 unterschiedliche Jahre und Abschnitte haben Nummerierung, sie sind effektiv identisch, also "C89" und "C90" wirklich beziehen sich auf die gleiche Sprache. Daher können Sie entweder "C89" oder "C90" sagen und dasselbe zu meinen, sogar für diejenigen, die sich aller Feinheiten bewusst sind.
Es gab auch einige kleine Überarbeitungen der ursprünglichen 1990 ISO Standard: "Normative Addendum 1" und zwei "Technische Berichtigungen" (nummeriert; technische Berichtigung 1 und TC2). Die beiden TCs sind als Fehlerbehebungen für Störungen in der Formulierung der Standard, während NA1 eine tatsächliche "Änderung" ist. In der Praxis tun dies die TCs nicht beeinflussen Benutzer wirklich, während NA1 eine ganze Reihe von Funktionen hinzufügt Menschen können verwenden, also ist NA1 wirklich bedeutender. NA1 kam heraus 1994, so könnte man sich auf "ISO 9899: 1990 wie von NA1 modifiziert" beziehen "C94". Ich habe es auch "C95" genannt.
Tags und Links c gcc c99 c89 compiler-construction