Seit dem Erscheinen der C (Programmiersprache)|Programmiersprache C im Jahre 1972 wurden mehrere "Varianten" (Spezifikationen und internationale Standards) veröffentlicht.
K&R-C Mit 'K&R'-C wird die C-Variante bezeichnet, wie sie ursprünglich von den Erfindern Brian W. Kernighan und Dennis Ritchie verfasst wurde und in der ersten Auflage ihres Buches 'The C Programming Language' von 1978 '(K&R1)' beschrieben ist.
Anker|C89Anker|C90C89, C90 Im Jahre 1983 wurde vom American National Standards Institute (ANSI) ein Komitee namens X3J11 gegründet, um eine Norm für die Programmiersprache C zu entwickeln. Als Grundlage für die Sprachdefinition diente die Programmiersprache C, wie sie von den Erfindern Brian W. Kernighan und Dennis Ritchie ('K&R-C') konzipiert wurde.
Nach sechsjähriger Arbeit konnte im Dezember 1989 die Norm 'ANSI X3.159-1989 Programming Language C' verabschiedet werden. Diese Fassung der Sprache C wird aufgrund ihres Erscheinungsjahres auch als 'C89' bezeichnet. Ein Jahr später, 1990, wurde diese Norm (mit ein paar kleineren Änderungen) von der WG14 der International Organization for Standardization|ISO als Norm 'ISO/IEC 9899:1990' ('C90'), übernommen. Die überarbeitete zweite Auflage des Buches 'The C Programming Language' von 1988 '(K&R2)' reflektiert die Änderungen an der Sprache durch den Standardisierungsprozess.
Viele der bis dato ungenormten Eigenschaften der Sprache wurden einheitlich festlegt, aber auch neue Sprachmittel wie Funktionsprototypen, ein leistungsfähigerer C-Präprozessor, sowie die Möglichkeit zur Deklaration von Konstante (Programmierung)|Konstanten, wurden in die Sprache aufgenommen. Die C-Norm räumte dabei unter anderem mit Unklarheiten in der ursprünglichen Definition auf, hierzu zählen die Ausführungsreihenfolge der vier Inkrement und Dekrement|Inkrement- und Dekrement-Operatoren (++, ). Mit der Norm wurde ferner der Umfang der enthaltenen Standard C Library|Standardbibliothek festgelegt.
Bis heute ist C90 die Sprachbasis für alle Derivat (Software)|Weiterentwicklungen der Programmiersprache C, unter anderem auch für das modernere C++, das über Möglichkeiten zur objektorientierte Programmierung|objektorientierten und generische Programmierung|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 benutzen, um auf die individuellen Komponenten des Computersystems zugreifen zu können.
Wichtigste Neuerungen von C90 * Der Funktionsumfang sowie das Verhalten der Funktionen der Standard C Library|C-Bibliothek wurden normiert. * Ein verbesserter C-Präprozessor|Präprozessor wurde eingeführt. * Funktionsprototypen wurden eingeführt. * Die neuen Schlüsselwörter const, volatile und signed wurden eingeführt. * Das ungenutzte Schlüsselwort entry wurde entfernt. * Unterstützung für 'wide character-' (mehr als 8 Bit Breite) sowie für Multibyte Character Set|Multibyte-Zeichensätze wurde hinzugefügt.
C95 1995 veröffentlichte die International Organization for Standardization|ISO eine Erweiterung – das Amendment 1 – zur C-Norm, die dann als 'ISO/IEC 9899:1994-09' '(C95)' bezeichnet wurde. Neben Fehlerkorrekturen gab es auch Änderungen am Sprachumfang.Internetquelle | url=http://www.lysator.liu.se/c/na1.html | titel=A brief description of Normative Addendum 1 | autor=Clive D.W. Feather | zugriff=2010-09-12 | sprache=en
Wichtigste Neuerungen von C95 * Verbesserung der Unterstützung von Multibyte- und 'wide character'-Zeichensätzen durch die Standardbibliothek. * Hinzufügen von Digraph (Informatik)|Digraphen zur Sprache. * Definition von Standard-Makros zur alternativen Schreibweise von Operatoren, zum Beispiel and für &&. * Definition des Standard-Makros __STDC_VERSION__.
C99 1995 wurde erneut ein Ausschuss gegründet, um C zu erweitern und zu verbessern. Daraus ging 1999 der neue 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'Internetquelle | url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/9899tc1/n32071.PDF | titel=C99 Technical Corrigendum 1 | zugriff=2010-09-22 | format=PDF | sprache=en , 2004 ein 'Technical Corrigendum 2'Internetquelle | url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/9899-1999_cor_2-2004.pdf | titel=C99 Technical Corrigendum 2 | zugriff=2010-09-22 | format=PDF | sprache=en und 2007 ein 'Technical Corrigendum 3'Internetquelle | url=http://www.iec.ch/cgi-bin/getcorr.pl/yab/iso/isoiec9899-cor3%7Bed1.0%7Den.pdf?file=iso/isoiec9899-cor3%7Bed1.0%7Den.pdf | titel=C99 Technical Corrigendum 3 | zugriff=2010-09-22 | format=PDF | sprache=en . C99 inklusive dieser Korrekturen wird informell auch als 'C0X' bezeichnet und bildet die Basis für kommende C-Standards.Internetquelle | url=http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1250.pdf | titel=Offizielle Charta für den C1X Standardisierungsprozess | autor=John Benito | zugriff=2010-09-12 | format=PDF | sprache=en
Mit C99 flossen einige aus C++ bekannte Erweiterungen in die Sprache C ein, zum Beispiel das Schlüsselwort inline und die Möglichkeit, Variablen innerhalb der For-Schleife|for-Anweisung zu deklarieren.
Wichtigste Neuerungen von C99 * Unterstützung von Komplexe Zahl|komplexen Zahlen durch den neuen Datentyp _Complex und entsprechende Funktionen in der Standardbibliothek. * Erweiterung der ganzzahligen Datentypen um einen mindestens 64 Bit breiten Typ long long, sowie um Typen mit vorgegebener Mindestbreite, zum Beispiel int_least8_t und uint_least32_t. Außerdem werden Integer (Datentyp)|Integer mit exakter Breite spezifiziert, aber als optional bezeichnet – zum Beispiel int32_t. * Lokale Feld (Datentyp)|Felder variabler Größe. * Der Boolesche Variable|boolesche Datentyp _Bool. Über einen eigenen Header <stdbool.h> wird für ihn ein Makro namens bool definiert. * Weiter verbesserte Unterstützung für internationale Zeichensätze. * Erweiterte Unterstützung von Gleitkommazahlen inklusive neuer mathematischer Funktionen in der C-Bibliothek. * Aliasing|Alias-freie Zeiger (Schlüsselwort restrict). * Frei platzierbare Deklaration von Bezeichnern (in C90 durften diese nur am Anfang eines Blocks stehen). * Inline-Funktionen (Schlüsselwort inline). * Verbot des „impliziten int“; Verbot impliziter Funktionsdeklarationen. * Hexadezimale Gleitkommakonstanten. Ein- und Ausgabe in scanf() und printf() über „%a“ und „%A“. * Präprozessor-Makros mit variabler Parameteranzahl. * Zulassen des aus C++ bekannten Zeilenkommentars „//“.
C1X Das Normierungskommitee WG14 arbeitet zur Zeit '(Stand: September 2010)' an einer Neuauflage des C-Standards mit Arbeitstitel 'C1X', basierend auf dem aktuell gültigen C99-Standard inklusive der 'Technical Corrigenda' TC1, TC2 und TC3 '(C0X)'.
Geplante Neuerungen von C1X Die Auflistung basiert auf diversen 'Technical Reports'Internetquelle | url=http://www.open-std.org/JTC1/SC22/WG14/www/projects | titel=Projekstatus für C1X | zugriff=2010-09-12 | sprache=en und dem aktuellen Arbeitsdokument zu C1X.Internetquelle | url=http://open-std.org/JTC1/SC22/WG14/www/docs/n1516.pdf | titel=ISO/IEC 9899:201x | format=PDF | zugriff=2010-10-31 | sprache=en | kommentar=nicht-normatives Arbeitsdokument
* Unterstützung von Multithreading (<threads.h>, <stdatomic.h>) * Angaben zur Speicherausrichtung von Objekten (<stdalign.h>) * Neue Datentypen char16_t und char32_t zur verbesserten Unterstützung von Unicode, insbesondere UTF-16 und UTF-32 * Änderungen an der Standardbilibothek zur Prüfung von Feldgrenzen zur Laufzeit des Programms, um z. B. Pufferüberlauf|Pufferüberläufe wirksamer vermeiden zu könnenInternetquelle | url=http://open-std.org/JTC1/SC22/WG14/www/docs/n1225.pdf | titel=Extensions to the C Library, Part I: Bounds-checking interfaces | format=PDF | sprache=en | zugriff=2010-10-31 | kommentar=Entwurf * Dynamische Allokation (Informatik)|Speicherallokation in neuen Bibliotheksfunktionen, zum Beispiel strdup und asprintfInternetquelle | url=http://open-std.org/JTC1/SC22/WG14/www/docs/n1337.pdf | titel=Extensions to the C Library, Part II: Dynamic Allocation Functions | format=PDF | sprache=en | zugriff=2010-10-31 | kommentar=Entwurf * Unterstützung der internen dezimalen Darstellung von Fließkommazahlen gemäß IEEE_754|IEEE 754-2008
Beispiele für den Unterschied zwischen verschiedenen Fassungen der Sprache C "K&R-C:"
/* Es gibt noch keine Funktionsprototypen. */ Ausgabe( str ) char *str; { printf( '%s\n', str ); }
main() { Ausgabe( 'Hallo Welt!' ); return 0; }
"C90"/"C95:"
#include
/* Das Argument darf nicht geändert werden. */ void Ausgabe( const char * const str ) { printf( '%s\n', str ); }
main() { Ausgabe( 'Hallo Welt!' ); return 0; }
"C99:"
#include
// Das Argument ist konstant und es gibt keinen Alias. void Ausgabe( const char * const restrict str ) { printf( '%s\n', str ); }
int main( void ) // der Rückgabetyp muss angegeben werden { Ausgabe( 'Hallo Welt!' ); // 'return 0;' muss nicht mehr angegeben werden. }
Einzelnachweise
Weblinks *Internetquelle | url=http://cm.bell-labs.com/cm/cs/who/dmr/chist.html | titel=The Development of the C Language | autor=Dennis M. Ritchie | zugriff=2010-09-12 | sprache=en *Internetquelle | url=http://flash-gordon.me.uk/ansi.c.txt | titel=Vorabversion des ANSI C Standards (ANSI X3J11/88-090) vom 13. Mai 1988 | format=TXT | zugriff=2010-09-12 | sprache=en *Internetquelle | url=http://www.lysator.liu.se/c/rat/title.html | titel=Rationale für C89 | zugriff=2010-09-12 | sprache=en *Internetquelle | url=http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf | titel=ISO/IEC 9899:1999 (C99) mit TC1, TC2 und TC3 | format=PDF | zugriff=2010-09-12 | sprache=en | kommentar=nicht-normatives Arbeitsdokument *Internetquelle | url=http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf | titel=Rationale für C99, Revision 5.10 | format=PDF | zugriff=2010-09-12 | sprache=en *Internetquelle | url=http://clc-wiki.net/wiki/C_resources:Compilers | titel=Liste von Compilern mit Informationen zur C99-Konformität | zugriff=2010-10-07 | sprache=en
Quelle: Seitentitel:Varianten der Programmiersprache C