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.
Antworten:
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_assert
und 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.c
Sie 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.quelle
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.
quelle
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.
quelle
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?"
quelle
int i; int test(double *p) { i=1; *p=2.0; return i; }
ein Compiler nichti
nach dem Schreiben neu geladen werden muss, wenn die*p
Möglichkeit besteht, dassp
die Adresse von enthalten isti
. Vollkommen vernünftig. Das Problem ist, dass moderne Compiler dieselbe Regel verwenden, um Annahmen zu rechtfertigen, die das Schreiben in along*
nicht beeinflussenlong 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.Diese Frage wurde im Internet nicht gründlich nach Antworten durchsucht.
-std=c99
was bereits in den anderen Antworten erwähnt wird.quelle
gcc
unterstützt-std=c89
und-std=gnu89
und-std=c99
und-std=gnu99
(und modern genug Versionen unterstützen-std=c11
und-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 .