Was ist der Unterschied zwischen C, C99, ANSI C und GNU C?

122

Ich habe mit dem Programmieren von Codechef begonnen und war durch den Unterschied zwischen C und C99 verwirrt . Was bedeutet C hier? Ist es C89? Überprüfen Sie die Sprachen am Ende dieser Übermittlung . Es enthält sowohl C als auch C99.

Ich habe im Internet etwas namens GNU C gefunden. Gibt es ein anderes C für Linux / Unix-Systeme? Entsprechen diese den C-Standards von ANSI? Ich habe auch an einigen Stellen "C99 streng" gelesen. Was ist das?

Gibt es andere unterschiedliche Standards für C? Gibt es etwas namens C 4.3.2 oder ist es die derzeit verwendete gcc-Version?

BEARBEITEN:

Dies , das , das hat geholfen. Ich werde mehr suchen und die Dinge bearbeiten, die unbeantwortet bleiben.

Ich bin kein Programmier-Neuling. Ich weiß, was C-Sprache ist. Ich weiß, dass es von ANSI verschiedene C-Standards wie C89, C99 und C11 gibt.

Aseem Bansal
quelle
@ Will ich nicht viel gesucht. Ich habe es jetzt getan. Ich werde mehr tun. und bearbeiten Sie die Frage mehr.
Aseem Bansal
@Will konnte ich nicht über C99 streng finden und ob das C in Codechef C89 oder das frühere nicht standardisierte Original C ist.
Aseem Bansal
1
Vergessen Sie nicht POSIX C :-)
pmg

Antworten:

216
  • Alles vor der Standardisierung wird nach dem berühmten Buch allgemein als "K & R C" bezeichnet, mit Dennis Ritchie, dem Erfinder der C-Sprache, als einem der Autoren. Dies war "die C-Sprache" von 1972-1989.

  • Der erste C-Standard wurde 1989 national in den USA von ihrem nationalen Standardinstitut ANSI veröffentlicht. Diese Version heißt C89 oder ANSI-C. Von 1989-1990 war dies "die C-Sprache".

  • Im Jahr danach wurde der amerikanische Standard international akzeptiert und von der ISO veröffentlicht (ISO 9899: 1990). Diese Version heißt C90. Technisch ist es der gleiche Standard wie C89 / ANSI-C. Formal ersetzte es C89 / ANSI-C und machte sie obsolet. Von 1990-1999 war C90 "die C-Sprache".

    Bitte beachten Sie, dass ANSI seit 1989 nichts mehr mit der C-Sprache zu tun hat. Programmierer, die immer noch über "ANSI C" sprechen, haben im Allgemeinen keine Ahnung, was es bedeutet. ISO "besitzt" die C-Sprache durch die Norm ISO 9899.

  • 1995 wurde ein kleines Update veröffentlicht, das manchmal als "C95" bezeichnet wird. Dies war keine größere Überarbeitung, sondern eine technische Änderung, die offiziell als ISO / IEC 9899: 1990 / Amd.1: 1995 bezeichnet wurde. Die Hauptänderung war die Einführung einer breiten Charakterunterstützung.

  • 1999 wurde der C-Standard einer umfassenden Überarbeitung unterzogen (ISO 9899: 1999). Diese Version des Standards heißt C99. Von 1999 bis 2011 war dies "die C-Sprache".

  • 2011 wurde der C-Standard erneut geändert (ISO 9899: 2011). Diese Version heißt C11. Verschiedene neue Funktionen wie _Generic, _Static_assertund Thread - Unterstützung wurden in die Sprache hinzugefügt. Das Update konzentrierte sich stark auf Multi-Core-, Multi-Processing- und Ausdruckssequenzierung. Von 2011 bis 2017 war dies "die C-Sprache".

  • Im Jahr 2017 wurde C11 überarbeitet und verschiedene Fehlerberichte wurden behoben. Diese Norm heißt informell C17 und wurde als ISO 9899: 2018 veröffentlicht. Es enthält keine neuen Funktionen, nur Korrekturen. Es ist die aktuelle Version der C-Sprache.


"C99 streng" bezieht sich wahrscheinlich auf eine Compilereinstellung, die einen Compiler zwingt, dem Standard durch den Buchstaben zu folgen. Der C-Standard enthält einen Begriff , der der Implementierung entspricht. Im Wesentlichen bedeutet dies: "Dieser Compiler implementiert die C-Sprache tatsächlich korrekt". Programme, die die C-Sprache korrekt implementieren, werden formal als streng konforme Programme bezeichnet .

"GNU C" kann zwei Dinge bedeuten. Entweder der C-Compiler selbst, der Teil der GNU Compiler Collection (GCC) ist. Oder es kann das nicht standardmäßige Standard-Setup bedeuten, das der GCC C-Compiler verwendet. Wenn Sie mit kompilieren, kompilieren gcc program.cSie nicht nach dem C-Standard, sondern nach einem nicht standardmäßigen GNU-Setup, das als "GNU C" bezeichnet werden kann. Beispielsweise wird der gesamte Linux-Kernel in nicht standardmäßigem GNU C und nicht in standardmäßigem C erstellt.

Wenn Sie Ihre Programme nach dem C-Standard kompilieren möchten, sollten Sie Folgendes eingeben gcc -std=c99 -pedantic-errors. Ersetzen Sie c99 durch c11, wenn Ihre GCC-Version dies unterstützt.

Lundin
quelle
8
Die strikte Compilereinstellung kann bedeuten: "Erweiterungen deaktivieren; Verwenden Sie nur die vom Standard definierte C-Sprache sowie oder mehr als „richtig kompilieren“. Es ist völlig richtig, Erweiterungen der Sprache zu akzeptieren. Der Standard wurde definiert, um dies zu ermöglichen.
Eric Postpischil
5
Es gab auch den C94 / C95-Änderungsantrag 1, der hauptsächlich eine breitere Charakterunterstützung hinzufügte. Siehe auch Liste der Standard-Header-Dateien in C und C ++ .
Jonathan Leffler
2
Sie schreiben, dass sich viele Dinge von C90 auf C99 geändert haben. Könnten Sie bitte einige nennen?
Martin Thoma
3
@Lundin du hast das falsche Buch für K & R verlinkt; Dies ist die zweite Ausgabe, die den C89-Standard beschreibt.
Antti Haapala
5
Ja, aber der Punkt ist, dass dies nicht die Version ist, die die Programmiersprache C bis zu diesem Punkt definiert hat. nicht, dass es irgendwo zum Verkauf stehen würde.
Antti Haapala
7

Ich muss in Bezug auf ANSI C antworten. Obwohl ANSI nichts damit gemacht hat, sind Compiler immer noch darauf aufgebaut. PIC XC16-Compiler zum Beispiel: "Der Compiler ist ein vollständig validierter Compiler, der dem ANSI C-Standard gemäß der ANSI-Spezifikation (ANSI x3.159-1989) entspricht und in Kernighan und Ritchies The C Programming Language (zweite Ausgabe) beschrieben ist. ... "Nicht alle Programmierungen sind für" große "Computer wie PCs. Das Schreiben eines Compilers für Ihre Gerätekosten und das Überprüfen der Kosten kostet Zeit & $. ANSI C lebt und lebt in Ihren Embedded- / Echtzeitgeräten.

C ist besser
quelle
4
  • ANSI C: Die erste C-Sprache wurde 1989 von der ANSI standardisiert. Deshalb heißt sie c89.

  • C99: Aufgrund
    der Anforderungen der Entwickler wurden in den Jahren 1999-2000 weitere oder zusätzliche Schlüsselwörter und Funktionen in C99 aufgenommen (z. B. inline, boolean .. Fließkomma-Funktionen der arthematischen Bibliothek hinzugefügt).

  • GNU C: GNU ist ein Unix-ähnliches Betriebssystem (www.gnu.org) und irgendwo benötigt das Projekt von GNU eine C-Programmiersprache, die auf dem ANSI C-Standard basiert. GNU verwendet den GCC-Compiler (GNU Compiler Collection), um den Code zu kompilieren. Es verfügt über eine C-Bibliotheksfunktion, die Systemaufrufe wie malloc, calloc, exit ... usw. Definiert

ANSI C ist ein Standard, der von den anderen Standards verwendet oder referiert wird.

Kapil Chittewan
quelle
Alles über C99 streng und ob das C in Codechef C89 oder das frühere nicht standardisierte Original C ist
Aseem Bansal
Korrektur: ANSI C ist ein veralteter Standard, auf den nur in veralteten Dokumenten verwiesen wird. Die C-Sprache heißt ISO C oder ISO / IEC 9899: 2011.
Lundin
1

Zusätzlich zu Lundin Antwort

Hier ist, was Dennis Richie zu sagen hat, wenn er gefragt wird

"Warum hat K & R nicht auf den endgültigen, genehmigten ANSI-Standard gewartet, bevor er die 2. Ausgabe von K & R geschrieben hat?"

Warum hat K & R nicht auf den endgültigen, genehmigten ANSI-Standard gewartet, bevor er die 2. Ausgabe von K & R geschrieben hat? Es scheint, dass dieses Buch nur einige Monate lang der richtige Standard sein wird, bevor es durch den endgültigen ANSI-Standard ersetzt wird. Ich weiß, dass es in diesem späten Stadium wahrscheinlich nur wenige größere Änderungen geben wird, aber warum nicht ein paar Monate warten und sicherstellen, dass Sie es zu 100% richtig machen, anstatt fast sofort eine dritte Ausgabe schreiben zu müssen oder veraltet zu sein?

Wir dachten, es wäre schön, den 10. Jahrestag der ersten Ausgabe zu feiern. Im Ernst, wir haben letzten Sommer mit der Arbeit begonnen, weil wir damals die Zeit und die Neigung hatten, und es schien, dass sich X3J11 einem Ende näherte. Im Dezember und Januar, als wir fertig waren, prüften wir, ob die Möglichkeit wichtiger Änderungen eine Verschiebung der Lieferung rechtfertigte, und entschieden (nach Erörterung der Angelegenheit mit dem Verlag), dass es sich nicht lohnt, darauf zu warten. PH wollte es und sowohl Brian als auch ich wollten es von unserer Tagesordnung.

Selbst wenn es Änderungen im Standard gibt, ist es schwer vorstellbar, dass sie umfangreich genug sind, um eine neue Ausgabe zu rechtfertigen. (Wir waren sogar bereit, mit Noalias irgendwie fertig zu werden, wenn es gedauert hätte.) Wir sind bereit, notwendige Änderungen in einem zukünftigen Druck vorzunehmen, aber es gibt Grund zu der Hoffnung, dass sie geringfügig sein sollten. Die Mitglieder von X3J11 sind sehr bemüht, auch ohne überraschende Leute fertig zu werden. Schließlich arbeiten viele von ihnen für Unternehmen, die ANSI-Compiler vorbereiten.

Dennis Ritchie

Suraj Jain
quelle
1
Schade, dass Dennis Ritchie nicht wusste, wie Aliasing-Regeln verwendet werden, um zu implizieren, dass Compiler keine Anstrengungen unternehmen sollten, um nützliche Formen des Aliasing zu erkennen, sondern dass Programmierer, deren Code von stumpfen Compilern gebrochen wird, den Compilern "danken" sollten Ihnen zu zeigen, dass ihr Code "fehlerhaft" ist - andernfalls hätte er den Leuten, die solche Regeln durchsetzen, sagen können, dass die Weigerung, Aliasing über die Mindestanforderungen des Standards hinaus zu unterstützen, Compiler für einige Zwecke ungeeignet macht und Code auf niedriger Ebene Aliasing benötigt kein Defekt.
Superkatze
@supercat Ich habe eigentlich nicht verstanden, was Aliasing-Regeln bedeuten. Kannst du mir helfen?
Suraj Jain
1
Das ursprüngliche Konzept war, dass ein bestimmter Code wie int i; int test(double *p) { i=1; *p=2.0; return i; }ein Compiler nicht inach dem Schreiben neu geladen werden muss, wenn die *pMöglichkeit besteht, dass pdie Adresse von enthalten ist i. Vollkommen vernünftig. Das Problem ist, dass moderne Compiler dieselbe Regel verwenden, um Annahmen zu rechtfertigen, die das Schreiben in a long*nicht beeinflussen long long, selbst wenn beide Typen dieselbe Größe und Darstellung haben , und dass Code niemals verwendet wird, selbst wenn zwei Strukturen eine gemeinsame Anfangssequenz verwenden Ein Zeiger eines Typs zum Lesen eines über den anderen geschriebenen CIS-Mitglieds.
Supercat
-2

Diese Frage wurde im Internet nicht gründlich nach Antworten durchsucht.

  1. C ist eine universelle Programmiersprache, die Dennis Ritchie zwischen 1969 und 1973 bei AT & T Bell Labs entwickelt hat.
  2. C99 ist ein Standard der C-Sprache, der von ISO veröffentlicht und um 1999 von ANSI übernommen wurde.
  3. GNU C ist nur eine Erweiterung von c89, während einige Funktionen von c99 ebenfalls hinzugefügt wurden. Es unterscheidet sich jedoch vollständig vom c99-Standard. Beim Kompilieren in gcc müssen wir also eingeben, -std=c99was bereits in den anderen Antworten erwähnt wird.
  4. ANSI C ist eine aufeinanderfolgende Reihe von Standards, die von ANSI veröffentlicht wurden.
0decimal0
quelle
Ich habe jetzt im Netz gesucht. Ich habe die Frage bearbeitet. Ich wusste über C- und ANSI-Standards Bescheid, bevor ich die Frage stellte. Ich habe Verwirrung in Bezug auf bestimmte Dinge. Ich werde versuchen, genauer zu sein.
Aseem Bansal
Alles über C99 streng und ob das C in Codechef C89 oder das frühere nicht standardisierte Original C ist
Aseem Bansal
4
Diese Antwort enthält viele Fehler. C99 ist ein von der ISO um 1999 definierter Standard. Die C-Sprache ist seit 23 Jahren international standardisiert. ANSI hat also nichts damit zu tun, sie haben seit 24 Jahren keinen C-Standard mehr berührt. Heutzutage drucken und vertreiben sie lediglich den ISO-Standard für den amerikanischen Markt.
Lundin
@ Lundin Oh !! Ja, eigentlich habe ich "definiert" geschrieben, was nicht der Fall ist, es sollte dort "übernommen" werden. Ich habe die Korrektur vorgenommen. ANSI veröffentlichte 1989 den allerersten Standard für C, der von ISO übernommen wurde. Danach fast alle Standards wurden von ISO veröffentlicht und von ANSI übernommen, und die Antwort ist kurz als gefragt, daher habe ich nur einige Dinge erwähnt, die die Antwort kurz halten.
0decimal0
1
Beachten Sie, dass gccunterstützt -std=c89und -std=gnu89und -std=c99und -std=gnu99(und modern genug Versionen unterstützen -std=c11und -std=gnu11). Der Unterschied besteht darin, dass Erweiterungen über Standard C automatisch verfügbar sind oder nur dann, wenn die Quelle den Compiler dazu veranlasst, ihnen geeignete Makros (z. B. -D_XOPEN_SOURCE=700) bereitzustellen .
Jonathan Leffler