Geschichte von C
ANSI-C
Geschichte
- 1970 Dennis Ritchie beginnt mit seiner Arbeit an der Programmiersprache C, in den nächsten Jahren erscheinen erste Beschreibungen
- 1978 „The C Programming Language “ von Brian Kernighan und Dennis Ritchie, „K&R-C “
- 1988 zweite, überarbeitete Auflage von „The C Programming Language “, sehr ähnlich zu ANSI X3.159-1989 .
- 1989 ANSI X3.159-1989 („ANSI-C “, „C89 “), erster Standard zu C, obwohl nur zirka ein Jahr lang maßgeblich, wird daher auch jede standardisierte Version von C manchmal auch „ANSI-C “ genannt
- 1990 ISO/IEC 9899:1990 (inhaltlich praktisch gleich zu ANSI X3.159-1989 ;„ISO-C “, „C90 “, berichtigt und ergänzt in ISO/IEC 9899/COR1:1994, ISO/IEC 9899/AMD1:1995 und ISO/IEC 9899/COR2:1996 )
- 1999 ISO/IEC 9899:1999 (E) (Berichtigt in ISO/IEC 9899:1999/Cor.1:2001, ISO/IEC 9899:1999/Cor.2:2004, und ISO/IEC 9899:1999/Cor.3:2007 )
- 2012 C1X (geplant)
Wegen der am 16. Dezember 2009 festgelegten Bevorzugung von ANSI-C, sollte erwogen werden, den Compiler nicht mehr mit »-std=c99«, sondern statt dessen mit »-ansi« oder »-std=c89« aufzurufen. Dadurch ergeben sich folgende Änderungen an den bisher behandelten Eigenschaften von C :
- Die Funktion »main« muß mit einer return -Anweisung verlassen werden.
- Beispiel
#include <stdlib.h> /* EXIT_SUCCESS */ int main( void )
{ return EXIT_SUCCESS; }
- Es gibt keine VLAs, also Reihungen, die gleichzeit eine erst zur Laufzeit bestimmte Größe und auch automatische Lebensdauer haben.
- Da deswegen der Präprozessor für die Bezeichnung von Reihungsdimensionen benötigt wird, is der Präprozessorgebrach in C90 noch weniger verpönt als in C99.
- Es gibt kein Schlüsselwort »restrict«.
- Es gibt keinen Längenmodifizierer »z« bei »printf« zur Ausgabe von Werten des Typs »size_t« mehr. Statt »printf( "%zu\n", sizeof 1 )« kann meist »printf( "%lu\n",( unsigned long )sizeof 1 )« eingesetzt werden. Hierbei wird ausgenutzt, daß daß eine Wert des Typs »size_t« wahrscheinlich nicht so groß ist, daß er nicht als Wert des Typs »unsigned long« repräsentiert werden kann, so daß er in diesen gewandelt und dann mit dem Umwandlungsspezifizierer für diesen Typ ausgegeben werden kann.
- Es gibt keinen Längenmodifizierer »t« bei »printf« zur Ausgabe von Werten des Typs »ptrdiff_t« mehr. Statt »printf( "%td\n", q - p )« kann meist »printf( "%lu\n",( long )( q - p ))« verwendet werden. Hierbei wird ausgenutzt, daß daß eine Wert des Typs »ptrdiff_t« wahrscheinlich nicht so groß ist, daß er nicht als Wert des Typs »long« repräsentiert werden kann, so daß er in diesen gewandelt und dann mit dem Umwandlungsspezifizierer für diesen Typ ausgegeben werden kann.
- Es gibt keinen Typ »long long int«.
- Es gibt keine mit zwei Schrägstrichen »//« eingeleiteten Zeilenendkommentare.
- Einige Fachbegriffe, wie „Direktive“ bei der Behandlung von »scanf«, wurden aus ISO/IEC 9899:1999 (E) entnommen, und könnten in X3.159-1989 anders lauten. Die verwendeten Fachbegriffe wurden jetzt nicht noch einmal daraufhin überprüft.
- Details einiger Standardfunktionen könnten sich unterscheiden. Die Beschreibungen der Standardfunktionen wurden jetzt nicht noch einmal daraufhin überprüft.
- Formal gesehen ist die in X3.159-1989 definierte Programmiersprache nicht C. Dies liegt darin, daß die Kultur der Programmiersprachen die fragwürdige Entscheidung getroffen hat, daß die Bedeutung von Namen von Programmiersprachen zeitabhängig sein kann. C ist damit keine bestimmte, unveränderliche Sprache, sondern zu jedem Zeitpunkt die Sprache, die durch den zu diesem Zeitpunkt gültigen Sprachstandard definiert ist. Der aktuelle C -Sprachstandard ISO/IEC 9899:1999 (E) enthält die Festlegung “This second edition cancels and replaces the first edition, ISO/IEC 9899:1990 ”. Damit wurde die vorherige ISO-Norm von 1990 für ungültig erklärt.
- Es kann schwierig sein, heute noch Exemplare des ANSI -C -Standards von 1989 oder des ISO -C -Standards von 1990 zu erwerben, da diese offiziell ja seit 20 Jahren als überholt gelten.
- In for-Schleifen können keine Variablen deklariert werden. »for( int i = 0; …« wird also »{ int i; for( i = 0; …«.
Einige andere Eigenschaft von ANSI-C im Vergleich zu C99, die aber bisher auch nicht im Kurs behandelt wurden:
- Es gibt keinen Datentyp für komplexe Zahlen.
- Es gibt auch weniger Unterstützung für Gleitkommaarithmetik.
- Bei externen Bezeichnern sind nur 6 Zeichen signifikant (eine Implementation kann aber mehr bieten).
- Durch implizite Funktionsdeklarationen gibt es etwas weniger Sicherheit.
- Deklarationen sind nur am Anfang eines Blocks erlaubt.
- Das Schlüsselwort »inline« entfällt.
- Die vscanf- und snprintf-Funktionen entfallen.
- Es gibt keinen Typ für Wahrheitswerte.