Varianten der Programmiersprache CSeit dem Erscheinen der Programmiersprache C im Jahr 1972 wurden mehrere Varianten (Spezifikationen und internationale Standards) veröffentlicht. K&R-CMit „K&R-C“ wird die ursprüngliche C-Variante bezeichnet, nach ihren Erfindern Brian W. Kernighan und Dennis Ritchie, die sie 1978 in der ersten Auflage ihres Buches The C Programming Language (K&R1) beschrieben. X/Open-CZiel von Standardisierungsbemühungen der X/Open Company, Ltd. war die Interoperabilität verschiedener Unix-Versionen im Jahr 1987. Die meisten Erweiterungen und Präzisierungen wurden später nach C89 übernommen. C89, C90Im Jahre 1983 gründete das American National Standards Institute (ANSI) das Komitee X3J11, um auf Grundlage von K&R-C eine Norm für die Programmiersprache C zu entwickeln. In sechsjähriger Arbeit entstand bis Dezember 1989 die Norm ANSI X3.159-1989 Programming Language C. Diese Sprachfassung wird nach dem Erscheinungsjahr auch als „C89“ bezeichnet. Ein Jahr später wurde sie mit kleinen Änderungen von der WG14 der ISO als Norm ISO/IEC 9899:1990 („C90“) übernommen. Auch die zweite Auflage des Buches The C Programming Language („K&R2“) übernahm 1988 diese Änderungen. Viele bisher ungenormte Spracheigenschaften waren jetzt einheitlich festgelegt, aber auch neue Sprachmittel wie Funktionsprototypen, ein leistungsfähigerer C-Präprozessor sowie die Deklaration von Konstanten wurden in die Sprache aufgenommen. Die C-Norm räumte unter anderem mit Unklarheiten in der ursprünglichen Definition auf, hierzu zählen die Ausführungsreihenfolge der vier Inkrement- und Dekrement-Operatoren ( Bis heute ist C90 die Sprachbasis für alle Weiterentwicklungen der Programmiersprache C, unter anderem auch für C++, das über Möglichkeiten zur objektorientierten und generischen Programmierung verfügt. Ein auf C90 basierendes Programm sollte ohne Probleme von jedem C-Compiler übersetzt und ausgeführt werden können. In der Praxis ist das nur bedingt der Fall, da fast alle C-Derivate zusätzliche Bibliotheken und Funktionsprototypen anbieten, die auf die individuellen Komponenten des Computersystems zugreifen. Die Bezeichnungen „ANSI C“, „C89“ und „ISO C90“ sind äquivalent. Softwareprojekte mit langer Historie wie cURL, SQLite und libxml2 sind (Stand 2022) ausschließlich in C89 geschrieben. CPython war bis Version 3.6 im Dialekt C89 abgefasst,[1] der Linux-Kernel[2] sogar über 30 Jahre bis Version 5.17 vom März 2022.[3] Neuerungen von C90
Präprozessortest auf C90-Kompatibilität#if __STDC__
/*
* C90-kompatibler Quellcode.
*/
#endif
C951995 veröffentlichte die ISO eine Erweiterung – das Amendment 1 – zur C-Norm, die dann als „ISO/IEC 9899/AMD1:1995“ (C95) bezeichnet wurde. Neben Fehlerkorrekturen gab es auch Änderungen am Sprachumfang.[4][5] Neuerungen von C95
Präprozessortest auf C95-Kompatibilität#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L
/*
* C95-kompatibler Quellcode.
*/
#endif
C991995 wurde erneut ein Ausschuss gegründet, um C zu erweitern und zu verbessern. Daraus ging 1999 der ISO-Standard ISO/IEC 9899:1999 hervor, auch als „C99“ bezeichnet. Er löste den Standard ISO/IEC 9899:1994-09 (C95) ab. Zu diesem Standard erschienen 2001 ein Technical Corrigendum 1[6], 2004 ein Technical Corrigendum 2[7] und 2007 ein Technical Corrigendum 3[8]. Mit C99 flossen einige aus C++ bekannte Erweiterungen in die Sprache C ein, zum Beispiel Inline-Funktionen und die Möglichkeit, Variablen innerhalb der Neuerungen von C99
Präprozessortest auf C99-Kompatibilität#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
// Compiler ist C99-kompatibel.
#endif
C11Das Normierungskomitee WG14 arbeitete an einer Neuauflage des C-Standards mit Arbeitstitel C1X, basierend auf dem C99-Standard inklusive der Technical Corrigenda TC1, TC2 und TC3 (C0X). Am 8. Dezember 2011 wurde C11 als ISO/IEC 9899:2011 verabschiedet.[9][10] Neuerungen von C11Die Auflistung basiert auf diversen Technical Reports[11] und dem aktuellen Arbeitsdokument zu C1X.[12]
Präprozessortest auf C11-Kompatibilität#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
// C11 kompatibler Quellcode.
#endif
C17Diese Norm entspricht der von C11 mit der Ausnahme von Fehlerkorrekturen und einem neuen Wert von __STDC_VERSION__ und wird daher im selben Umfang wie C11 unterstützt.[14] Der Standard wurde im Juni 2018 unter der Norm ISO/IEC 9899:2018 freigegeben.[15] C23 (C2x)C23 (zuvor meist noch als C2x bezeichnet) ist der noch informelle Name für die nächste und für das Jahr 2023 geplante Revision des C-Standards.[16][17] Zu den noch nicht verabschiedeten Neuerungen sollen u. a. die Aufnahme von Attributen (wie sie bereits als Compiler-abhängige Erweiterungen üblich waren) mit einer neuen Syntax,[18] die binäre Schreibweise von Integerkonstanten,[19] und die Einführung neuer Präprozessor-Direktiven gehören.[veraltet] Beispiele für den Unterschied zwischen verschiedenen Fassungen der Sprache CK&R-C: /* Es gibt noch keine Funktionsprototypen.
Die Funktion gibt implizit ein (hier undefiniertes) int zurück, void und const gibt es noch nicht */
Ausgabe(str)
char *str;
{
printf("%s\n", str);
}
main()
{
Ausgabe("Hallo Welt!");
return 0;
}
C90/C95: #include <stdio.h>
/* Das Argument darf nicht geändert werden. */
void Ausgabe(const char * const str) {
printf("%s\n", str);
}
main() {
Ausgabe("Hallo Welt!");
return 0;
}
C99/C11: #include <stdio.h>
void Ausgabe(char *str) {
printf("%s\n", str);
}
int main() {
Ausgabe("Hallo Welt!");
/* Ab C99 auch implizite Beendigung, interpretiert als: return 0; */
}
Weblinks
Einzelnachweise
|