- Varianten der Programmiersprache C
-
Seit dem Erscheinen der Programmiersprache C im Jahre 1972 wurden mehrere Varianten (Spezifikationen und internationale Standards) veröffentlicht.
Inhaltsverzeichnis
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.
C89, 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 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 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-Operatoren (
++
,--
). Mit der Norm wurde ferner der Umfang der enthaltenen Standardbibliothek festgelegt.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 benutzen, um auf die individuellen Komponenten des Computersystems zugreifen zu können.
Wichtigste Neuerungen von C90
- Der Funktionsumfang sowie das Verhalten der Funktionen der C-Bibliothek wurden normiert.
- Ein verbesserter Präprozessor wurde eingeführt.
- Funktionsprototypen wurden eingeführt.
- Die neuen Schlüsselwörter
const
,volatile
undsigned
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-Zeichensätze wurde hinzugefügt.
Präprozessortest auf C90-Kompatibilität
#if __STDC__ /* * C90-kompatibler Quellcode. */ #endif
C95
1995 veröffentlichte die 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.[1]
Wichtigste Neuerungen von C95
- Verbesserung der Unterstützung von Multibyte- und wide character-Zeichensätzen durch die Standardbibliothek.
- Hinzufügen von Digraphen zur Sprache.
- Definition von Standard-Makros zur alternativen Schreibweise von Operatoren, zum Beispiel
and
für&&
. - Definition des Standard-Makros
__STDC_VERSION__
.
Präprozessortest auf C95-Kompatibilität
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L /* * C95-kompatibler Quellcode. */ #endif
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[2], 2004 ein Technical Corrigendum 2[3] und 2007 ein Technical Corrigendum 3[4]. C99 inklusive dieser Korrekturen wird informell auch als C0X bezeichnet und bildet die Basis für kommende C-Standards.[5]
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 derfor
-Anweisung zu deklarieren.Wichtigste Neuerungen von C99
- Unterstützung von 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 Beispielint_least8_t
unduint_least32_t
. Außerdem werden Integer mit exakter Breite spezifiziert, aber als optional bezeichnet – zum Beispielint32_t
. - Lokale Felder variabler Größe.
- Der boolesche Datentyp
_Bool
. Über einen eigenen Header<stdbool.h>
wird für ihn ein Makro namensbool
definiert. - Weiter verbesserte Unterstützung für internationale Zeichensätze.
- Erweiterte Unterstützung von Gleitkommazahlen inklusive neuer mathematischer Funktionen in der C-Bibliothek.
- 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()
undprintf()
über „%a
“ und „%A
“. - Präprozessor-Makros mit variabler Parameteranzahl.
- Zulassen des aus C++ bekannten Zeilenkommentars „
//
“.
Präprozessortest auf C99-Kompatibilität
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L // C99 kompatibler Quellcode. #endif
C1X
Das Normierungskommitee WG14 arbeitet zurzeit (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[6] und dem aktuellen Arbeitsdokument zu C1X.[7]
- Unterstützung von Multithreading (
<threads.h>
,<stdatomic.h>
) - Angaben zur Speicherausrichtung von Objekten (
<stdalign.h>
) - Neue Datentypen
char16_t
undchar32_t
zur verbesserten Unterstützung von Unicode, insbesondere UTF-16 und UTF-32 - Änderungen an der Standardbibliothek zur Prüfung von Feldgrenzen zur Laufzeit des Programms, um z. B. Pufferüberläufe wirksamer vermeiden zu können[8]
- Dynamische Speicherallokation in neuen Bibliotheksfunktionen, zum Beispiel
strdup
undasprintf
[9] - Unterstützung der internen dezimalen Darstellung von Gleitkommazahlen gemäß IEEE 754-2008
- Entfernung der Bibliotheksfunktion
gets
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 <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:
#include <stdio.h> // 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
- ↑ Clive D.W. Feather: A brief description of Normative Addendum 1. Abgerufen am 12. September 2010 (englisch).
- ↑ C99 Technical Corrigendum 1. Abgerufen am 22. September 2010 (PDF, englisch).
- ↑ C99 Technical Corrigendum 2. Abgerufen am 22. September 2010 (PDF, englisch).
- ↑ C99 Technical Corrigendum 3. Abgerufen am 22. September 2010 (PDF, englisch).
- ↑ John Benito: Offizielle Charta für den C1X Standardisierungsprozess. Abgerufen am 12. September 2010 (PDF, englisch).
- ↑ Projektstatus für C1X. Abgerufen am 12. September 2010 (englisch).
- ↑ ISO/IEC 9899:201x. Abgerufen am 11. April 2011 (PDF, englisch, nicht-normatives Arbeitsdokument).
- ↑ Extensions to the C Library, Part I: Bounds-checking interfaces. Abgerufen am 31. Oktober 2010 (PDF, englisch, Entwurf).
- ↑ Extensions to the C Library, Part II: Dynamic Allocation Functions. Abgerufen am 31. Oktober 2010 (PDF, englisch, Entwurf).
Weblinks
- Dennis M. Ritchie: The Development of the C Language. Abgerufen am 12. September 2010 (englisch).
- Vorabversion des ANSI C Standards (ANSI X3J11/88-090) vom 13. Mai 1988. Abgerufen am 12. September 2010 (TXT, englisch).
- Rationale für C89. Abgerufen am 12. September 2010 (englisch).
- ISO/IEC 9899:1999 (C99) mit TC1, TC2 und TC3. Abgerufen am 12. September 2010 (PDF, englisch, nicht-normatives Arbeitsdokument).
- Rationale für C99, Revision 5.10. Abgerufen am 12. September 2010 (PDF, englisch).
- Liste von Compilern mit Informationen zur C99-Konformität. Abgerufen am 7. Oktober 2010 (englisch).
Wikimedia Foundation.