C89 vs c99 GCC-Compiler

8

Gibt es einen Unterschied, wenn ich das folgende Programm mit c89 gegen c99 kompiliere? Ich bekomme die gleiche Ausgabe. Gibt es wirklich einen Unterschied zwischen den beiden?

%Vor%     
user69514 16.02.2010, 05:38
quelle

3 Antworten

27
  • // Kommentare sind nicht Teil von C89, aber in C99,
  • das Abfallen von 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 mit int kompatibel ist, entspricht eine Rückgabe vom ersten Aufruf an die Hauptfunktion dem Aufruf der Funktion exit mit dem von main zurückgegebenen Wert. Funktion als sein Argument; Das Erreichen der } , die die Funktion main beendet, gibt einen Wert von 0 zurück.

Ihr Code hat also ein undefiniertes Verhalten in C89 und ein wohldefiniertes Verhalten in C99.

    
Alok Singhal 16.02.2010 05:56
quelle
6

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.

    
Jerry Coffin 16.02.2010 05:44
quelle
1

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.

    
Artem 16.02.2010 05:45
quelle

Tags und Links