C Standardbibliothek

Das C Standardbibliothek oder libc ist der Standardbibliothek für die C Programmiersprache, wie in der angegeben ISO c Standard.[1] Ausgehend vom Original Ansi c Standard, es wurde gleichzeitig entwickelt wie Die C -Bibliotheksposix -Spezifikation, das ist ein Superset davon.[2][3] Da wurde Ansi C von der übernommen Internationale Standardisierungsorganisation,[4] Die C -Standardbibliothek wird auch als die genannt ISO C -Bibliothek.

Die C -Standardbibliothek bietet Makros, Typ Definitionen und Funktionen für Aufgaben wie z. Saite Handhabung, mathematische Berechnungen, Eingangs-/Ausgangsverarbeitung, Speicherverwaltungund mehrere andere Betriebssystem Dienstleistungen.

Programmierschnittstelle

Header -Dateien

1999 ISO C.pdf

Das Programmierschnittstelle (API) der C -Standardbibliothek wird in einer Reihe von deklariert Header -Dateien. Jede Header -Datei enthält eine oder mehrere Funktionserklärungen, Datentypdefinitionen und Makros.

Nach einer langen Zeit der Stabilität drei neue Header -Dateien (ISO646.H, wchar.h, und WCTTYPE.H) wurden mit hinzugefügt mit Normativer Addendum 1 (NA1), eine Ergänzung zum C -Standard von C im Jahr 1995. Sechs weitere Header -Dateien (komplex.h, Fenv.h, inttypes.h, stdbool.h, stdint.h, und tgmath.h) wurden mit hinzugefügt mit C99, eine Überarbeitung des 1999 veröffentlichten C -Standards und fünf weitere Dateien (stdalign.h, Stdatomic.h, stdnoreturn.h, threads.h, und uchar.h) mit C11 Insgesamt im Jahr 2011 gibt es jetzt 29 Header -Dateien:

Name Aus Beschreibung
Enthält die behaupten Makro, verwendet, um logische Fehler und andere Arten von Fehler in Debugging -Versionen eines Programms zu erkennen.
C99 A Funktionen zum Manipulieren komplexe Zahlen.
Definiert Funktionen Wird verwendet, um Zeichen nach ihren Typen zu klassifizieren oder zwischen dem oberen und unteren Fall auf eine Weise zu konvertieren, die unabhängig vom verwendeten ist Zeichensatz (Typisch ASCII oder eine seiner Erweiterungen, obwohl Implementierungen verwendet werden Ebcdic sind auch bekannt).
Für Testfehlercodes, die von Bibliotheksfunktionen gemeldet wurden.
C99 Definiert a Funktionen zur Kontrolle Schwimmpunkt Umgebung.
Definiert Makrokonstanten Angabe der implementierungsspezifischen Eigenschaften der Schwimmpunkt Bibliothek.
C99 Definiert Ganzzahl genaue Breite.
Na1 Definiert mehrere Makros Diese implementieren alternative Möglichkeiten, um mehrere Standard -Token auszudrücken. Für das Programmieren ISO 646 Variante Zeichensätze.
Definiert Makrokonstanten Angabe der implementierungsspezifischen Eigenschaften der Ganzzahltypen.
Definiert Lokalisierungsfunktionen.
Definiert gemeinsame mathematische Funktionen.
Erklärt die Makros setjmp und longjmp, die für nicht lokale Ausgänge verwendet werden.
Definiert Signalhandhabungsfunktionen.
C11 Zum Abfragen und Angeben der Ausrichtung von Objekten.
Für den Zugriff auf eine unterschiedliche Anzahl von Argumenten, die an Funktionen übergeben wurden.
C11 Zum atomare Operationen auf Daten, die zwischen Threads geteilt werden.
C99 Definiert ein boolescher Datentyp.
Definiert mehrere nützliche Typen und Makros.
C99 Definiert Ganzzahl genaue Breite.
Definiert Kerneingangs- und Ausgangsfunktionen
Definiert Numerische Konvertierungsfunktionen, Pseudo-Random-Zahlengenerierungsfunktionen, Speicherzuweisung, Prozesskontrollfunktionen
C11 Zur Angabe von Funktionen ohne Rückkehr
Definiert Saitenhandhabungsfunktionen
C99 Definiert Typ-generische mathematische Funktionen.
C11 Definiert Funktionen für die Verwaltung mehrerer Mehrfach Themen, Mutexes und Zustandsvariablen
Definiert Datums- und Zeithandhabungsfunktionen
C11 Typen und Funktionen zum Manipulieren Unicode Figuren
Na1 Definiert Weitnacht-Handling-Funktionen
Na1 Definiert Funktionen Wird verwendet, um breite Zeichen nach ihren Typen zu klassifizieren oder zwischen oberem und unteren Fall zu konvertieren

Drei der Header -Dateien (komplex.h, Stdatomic.h, und threads.h) sind bedingte Funktionen, die Implementierungen nicht unterstützen müssen.

Das Posix Standard fügte mehrere nicht standardmäßige C-Header für Unix-spezifische Funktionen hinzu. Viele haben ihren Weg zu anderen Architekturen gefunden. Beispiele beinhalten fcntl.h und Unistd.h. Eine Reihe anderer Gruppen verwenden andere nicht standardmäßige Header - die GNU C -Bibliothek hat alloca.hund HP OpenVMS hat die va_count () Funktion.

Dokumentation

Auf UNIX-ähnlichen Systemen wird die maßgebliche Dokumentation der tatsächlich implementierten API in Form von angegeben Mannseiten. Auf den meisten Systemen befinden sich MAN -Seiten zu Standardbibliotheksfunktionen in Abschnitt 3; Abschnitt 7 kann einige generische Seiten zugrunde liegenden Konzepten enthalten (z. Mann 7 Math_error in Linux).

Implementierungen

Unix-artig Systeme haben normalerweise eine C -Bibliothek in gemeinsame Bibliothek Formular, aber die Header -Dateien (und Compiler Toolchain) können in einer Installation nicht vorhanden sein, sodass C -Entwicklung möglicherweise nicht möglich ist. Die C-Bibliothek wird als Teil des Betriebssystems auf UNIX-ähnlichen Systemen angesehen. Die C -Funktionen, einschließlich der ISO C -Standard, werden von Programmen häufig verwendet und werden als nicht nur eine Implementierung von etwas in der C -Sprache, sondern auch angesehen de facto Teil der Betriebssystemschnittstelle. UNIX-ähnliche Betriebssysteme können im Allgemeinen nicht funktionieren, wenn die C-Bibliothek gelöscht wird. Dies gilt für Anwendungen, die dynamisch im Gegensatz zu statisch verknüpften sind. Ferner arbeitet der Kernel selbst (zumindest im Fall von Linux) unabhängig von Bibliotheken.

Auf Microsoft Windows, den dynamischen Kernbibliotheken (Core System) (Dlls) Bereitstellung einer Implementierung der C -Standardbibliothek für die Microsoft Visual C ++ Compiler V6.0; Die C -Standardbibliothek für neuere Versionen des Microsoft Visual C ++ - Compiler wird von jedem Compiler einzeln sowie einzeln bereitgestellt umverteilbar Pakete. Kompilierte in C geschriebene Anwendungen sind entweder statisch mit einer C -Bibliothek verknüpft oder mit einer dynamischen Version der Bibliothek verknüpft, die mit diesen Anwendungen versendet wird, anstatt sich darauf zu verlassen, dass sie sich auf den Zielsystemen vorstellen. Funktionen in der C -Bibliothek eines Compiler werden nicht als Schnittstellen zu Microsoft Windows angesehen.

Es gibt viele andere Implementierungen, die sowohl mit verschiedenen Betriebssystemen als auch mit C -Compilern ausgestattet sind. Einige der beliebten Implementierungen sind die folgenden:

Compiler-integrierte Funktionen

Einige Compiler (zum Beispiel, GCC[7]) Integrierte Versionen vieler Funktionen in der C-Standardbibliothek; Das heißt, die Implementierungen der Funktionen werden in die kompilierten Objektdateiund das Programm ruft die integrierten Versionen anstelle der Funktionen in der C-Bibliothek auf gemeinsames Objekt Datei. Dies reduziert den Überkopf in der Reihe Varianten und erlaubt andere Formen von Optimierung (Wie der Compiler das kennt Kontrollfluss Eigenschaften der eingebauten Varianten), können jedoch beim Debuggen Verwirrung verursachen (z. B. können die integrierten Versionen nicht ersetzt werden instrumentiert Varianten).

Die integrierten Funktionen müssen sich jedoch wie gewöhnliche Funktionen gemäß ISO C verhalten. Die Hauptimplikation ist, dass das Programm in der Lage sein muss, einen Zeiger auf diese Funktionen zu erstellen, indem sie ihre Adresse annehmen, und die Funktion durch diesen Zeiger aufzurufen. Wenn zwei Zeiger auf die gleiche Funktion in zwei verschiedenen Übersetzungseinheiten im Programm abgeleitet sind, müssen diese beiden Zeiger gleich vergleichen. Das heißt, die Adresse wird von dem Namen der Funktion gelöst, die eine externe (programmweite) Verknüpfung aufweist.

Verknüpfung, libm

Unter FreeBSD[8] und Glibc,[9] Einige Funktionen wie sin () sind standardmäßig nicht in Verbindung gebracht und werden stattdessen in der mathematischen Bibliothek gebündelt libm. Wenn einer von ihnen verwendet wird, muss der Linker die Richtlinie erhalten -lm. POSIX verlangt, dass der C99 -Compiler unterstützt -lmund dass die Funktionen in den Headern deklariert wurden math.h, komplex.h, und Fenv.h sind zur Verknüpfung erhältlich, wenn -lm wird angegeben, gibt jedoch nicht an, ob die Funktionen standardmäßig verknüpft sind.[10] Musl erfüllt diese Anforderung, indem er alles in eine einzige Bibliothek in Libc einbringt und ein leeres LIBM bereitstellt.[11]

Erkennung

Gemäß dem C -Standard das Makro __Stdc_hosted__ soll definiert werden 1 Wenn die Implementierung gehostet wird. Eine implementierte Implementierung hat alle vom C -Standard angegebenen Header. Eine Implementierung kann auch sein freistehend Was bedeutet, dass diese Header nicht vorhanden sind. Wenn eine Implementierung ist freistehend, es soll definieren __Stdc_hosted__ zu 0.

Probleme und Problemumgehungen

Pufferüberlaufschwachstellen

Einige Funktionen in der C -Standardbibliothek waren dafür berüchtigt, sie zu haben Pufferüberlauf Schwachstellen und im Allgemeinen fördern die Buggy -Programmierung seit ihrer Einführung.[a] Die am stärksten kritisierten Gegenstände sind:

  • String-Manipulationsroutinen, einschließlich Strcpy () und Strcat (), mangels Grenzenprüfung und mögliche Pufferüberläufe, wenn die Grenzen nicht manuell überprüft werden.
  • String -Routinen im Allgemeinen, für NebenwirkungenVerantwortungsloser Pufferverbrauch fördern, nicht immer gültig garantiert null-terminiert Ausgabe, Berechnung der linearen Länge;[b]
  • printf () Familie von Routinen, um die zu verderben Ausführungsstapel Wenn die Formatzeichenfolge nicht mit den angegebenen Argumenten übereinstimmt. Dieser grundlegende Fehler schuf eine ganze Klasse von Angriffen: Format -String -Angriffe;
  • erhält () und scanf () Familie von E/A -Routinen, aus mangelnder (entweder oder einfacher) Eingablängenprüfung.

Außer dem extremen Fall mit erhält ()Alle Sicherheitslücken können vermieden werden, indem Hilfscode eingeführt wird, um die Speicherverwaltung, die Grenzenprüfung, die Eingabeprüfung usw. durchzuführen. Dies geschieht häufig in Form von Wrappern, die die Standardbibliotheksfunktionen sicherer und einfacher machen. Dies stammt aus so früh wie Die Praxis der Programmierung Buch von B. Kernighan und R. Pike, wo die Autoren üblicherweise Wrapper verwenden, die Fehlermeldungen drucken und das Programm beenden, wenn ein Fehler auftritt.

Das ISO C-Komitee veröffentlichte technische Berichte TR 24731-1[12] und arbeitet an TR 24731-2[13] Vorschläge der Übernahme einiger Funktionen mit Grenzenprüfung und automatischer Pufferzuweisung entsprechend. Ersteres hat schwerwiegende Kritik mit etwas Lob erfüllt,[14][15] Letzteres erhielt gemischte Antworten. Trotzdem wurde TR 24731-1 in die C-Standardbibliothek von Microsoft implementiert, und der Compiler gibt Warnungen bei der Verwendung alter "unsicherer" Funktionen aus.

Fadenprobleme, Anfälligkeit für Rassenbedingungen

Das Strerror () Routine wird dafür kritisiert Faden unsicher und ansonsten anfällig für Rennbedingungen.

Fehlerbehandlung

Die Fehlerbehandlung der Funktionen in der C -Standardbibliothek ist nicht konsistent und manchmal verwirrend. Gemäß der Linux -Handbuchseite Mathematische Fehler, "Die aktuelle (Version 2.8) Situation unter GLIBC ist chaotisch. Die meisten (aber nicht alle) Funktionen werfen Ausnahmen von Fehlern auf Errno. Ein paar Funktionen gesetzt Errno, aber erheben Sie keine Ausnahme. Nur wenige Funktionen tun auch nicht. "[16]

Standardisierung

Das Original C Sprache stellte keine integrierten Funktionen wie E/A-Operationen vor, im Gegensatz zu herkömmlichen Sprachen wie z. Cobol und Forran. Im Laufe der Zeit haben die Benutzergemeinschaften von C gemeinsamen Ideen und Implementierungen von sogenannten C -Standardbibliotheken geteilt. Viele dieser Ideen wurden schließlich in die Definition der standardisierten C -Sprache aufgenommen.

Beide Unix und c wurden bei erstellt bei AT & T's Bell Laboratories In den späten 1960er und frühen 1970er Jahren. In den 1970er Jahren wurde die C -Sprache immer beliebter. Viele Universitäten und Organisationen begannen, ihre eigenen Sprachvarianten für ihre eigenen Projekte zu schaffen. Zu Beginn der 1980er Jahre wurde Kompatibilitätsprobleme zwischen den verschiedenen C -Implementierungen offensichtlich. 1983 the American National Standards Institute (ANSI) bildete ein Komitee, um eine Standardspezifikation von C bekannt zu machen, die als "bezeichnet wird"Ansi c"Diese Arbeit gipfelte in der Schaffung des sogenannten C89-Standards im Jahr 1989. Teil des resultierenden Standards war ein Satz von Software -Bibliotheken genannt die ANSI C -Standardbibliothek.

POSIX -Standardbibliothek

Posix, ebenso gut wie SusGeben Sie eine Reihe von Routinen an, die über denen in der Basis -C -Standardbibliothek verfügbar sein sollten. Die POSIX -Spezifikation enthält unter anderem Header -Dateien für, unter anderem. Multi-Threading, Networking, und Reguläre Ausdrücke. Diese werden häufig neben der C -Standardbibliotheksfunktionalität mit unterschiedlichem Graden der Nähe implementiert. Zum Beispiel, Glibc implementiert Funktionen wie z. Gabel innerhalb libc.so, Aber vorher Nptl wurde in glibc zusammengeführt und bildete eine separate Bibliothek mit einem eigenen Linker -Flag -Argument. Oft wird diese von POSIX spezifizierte Funktionalität als Teil der Bibliothek angesehen. Die grundlegende C -Bibliothek kann als ANSI oder identifiziert werden ISO C Bibliothek.

BSD LIBC

BSD LIBC ist eine Superset der POSIX -Standardbibliothek, die von den C -Bibliotheken unterstützt wird, die enthalten sind BSD Betriebssysteme wie zum Beispiel Freebsd, Netbsd, OpenBSD und Mac OS. BSD LIBC hat einige Erweiterungen, die nicht im ursprünglichen Standard definiert sind, von denen viele erstmals 1994 erschienen sind 4.4bs Veröffentlichung (die erste, die nach dem ersten Standard 1989 weitgehend entwickelt wurde). Einige der Erweiterungen von BSD LIBC sind:

  • sys/tree.h- enthält eine Implementierung von Rot -Schwarz -Baum und Spreizbaum[17][18]
  • sys/queue.h- Implementierungen von Verlinkte Liste, Warteschlangen, Schwanzwarteschlange usw.[19][20]
  • fGetln ()- definiert in stdio.h. Dies kann verwendet werden, um eine Dateizeile für Zeile zu lesen.[21][22][23]
  • fts.h- Enthält einige Funktionen, um eine Dateihierarchie zu durchqueren[24][25]
  • db.h- Einige Funktionen zur Verbindung mit dem Berkeley DB[26][27]
  • strlcat () und strlcpy ()- sichere Alternativen für strncat () und strncpy ()[28][29][30][31][32]
  • err.h- Enthält einige Funktionen zum Drucken formatierter Fehlermeldungen[33][34]
  • vis.h- enthält die vis () Funktion. Diese Funktion wird verwendet, um nicht druckbare Zeichen in einem visuellen Format anzuzeigen.[35][36][37]

Die C -Standardbibliothek in anderen Sprachen

Einige Sprachen enthalten die Funktionalität der Standard -C -Bibliothek in ihren eigenen Bibliotheken. Die Bibliothek kann angepasst werden, um besser zur Struktur der Sprache zu passen, aber die Betriebssemantik werden ähnlich gehalten. Das C ++ Die Sprache enthält beispielsweise die Funktionalität der C -Standardbibliothek in der Namespace std (z.B., std :: printf, std :: atoi, std :: feof) in Header -Dateien mit ähnlichen Namen wie die C (CSTDIO, cmath, CSTDLIB, etc.). Andere Sprachen, die ähnliche Ansätze verfolgen D, Perl, Rubin und die Hauptumsetzung von Python bekannt als Cpython. In Python 2 werden beispielsweise die integrierten Dateiobjekte als "implementiert mit C's stdio Paket",[38] Damit werden die verfügbaren Operationen (offen, lesen, schreiben usw.) das gleiche Verhalten wie die entsprechenden C -Funktionen haben. Rost Hat eine Kiste namens libc Dadurch können mehrere C -Funktionen, Strukturen und andere Typdefinitionen verwendet werden.[39]

Vergleich zu Standardbibliotheken anderer Sprachen

Die C -Standardbibliothek ist im Vergleich zu den Standardbibliotheken einiger anderer Sprachen gering. Die C -Bibliothek bietet eine grundlegende Reihe mathematischer Funktionen, String Manipulation, Geben Sie Conversions einund Datei und Konsolenbasierte I/O. Es enthält keinen Standardsatz von "Behältertypen" wie C ++ Standard -Vorlagenbibliothek, geschweige denn die vollständige grafische Benutzeroberfläche (GUI) Toolkits, Netzwerkwerkzeuge und Fülle anderer Funktionen, die Java und die .NET Framework standardmäßig bereitstellen. Der Hauptvorteil der kleinen Standardbibliothek besteht darin, dass die Bereitstellung einer funktionierenden ISO -C -Umgebung viel einfacher ist als bei anderen Sprachen, und folglich ist es vergleichsweise einfach, C auf eine neue Plattform zu portieren.

Siehe auch

Anmerkungen

  1. ^ Morris Worm Das nutzt die bekannte Verwundbarkeit in erhält () wurden bereits 1988 geschaffen.
  2. ^ In der C -Standardbibliothek haben die Berechnung der Stringlänge und die Suche nach dem Ende einer Zeichenfolge lineare Zeitkomplexitäten und sind ineffizient, wenn sie wiederholt in denselben oder verwandten Zeichenfolgen verwendet werden

Verweise

  1. ^ ISO/IEC (2018). ISO/IEC 9899: 2018 (e): Programmiersprachen - C. §7
  2. ^ "Die GNU C -Bibliothek - Einführung". gnu.org. Abgerufen 2013-12-05.
  3. ^ "Unterschied zwischen C -Standardbibliothek und C POSIX -Bibliothek". stackoverflow.com. 2012. Abgerufen 2015-03-04.
  4. ^ "C Standards". Keil. Abgerufen 24. November 2011.
  5. ^ "Re: Unterstützt Newlib MMU-ohne CPUs?". Cygwin.com. 23. März 2006. archiviert von das Original am 22. November 2008. Abgerufen 28. Oktober 2011.
  6. ^ "Musl libc". Etalabs.net. Abgerufen 28. Oktober 2011.
  7. ^ Andere integrierte Funktionen von GCC, GCC -Handbuch
  8. ^ "Zusammenstellung mit CC". Abgerufen 2013-03-02.
  9. ^ Weimer, Florian. "C - für welche Funktionen ist das Libm bestimmt?". Paketüberfluss. Abgerufen 24. Februar 2021.
  10. ^ "C99 - Standard -C -Programme kompilieren". Die Open Group Basis Specialations Ausgabe 7, 2018 Ausgabe. Die offene Gruppe. Abgerufen 24. Februar 2021.
  11. ^ "Musl -FAQ". www.musl-libc.org. Abgerufen 24. Februar 2021.
  12. ^ "ISO/IEC TR 24731-1: Erweiterungen zur C-Bibliothek, Teil I: Grenzen-Überprüfungs-Schnittstellen" (PDF). Open-STD.org. 2007-03-28. Abgerufen 2014-03-13.
  13. ^ "ISO/IEC WDTR 24731-2: Erweiterungen zur C-Bibliothek, Teil II: Dynamische Zuordnungsfunktionen" (PDF). Open-STD.org. 2008-08-10. Abgerufen 2014-03-13.
  14. ^ Verwenden Sie die TR 24731 -Funktionen in Ihrem C -Code? - Paketüberfluss
  15. ^ "Austin Group Review von ISO/IEC WDTR 24731". Abgerufen 28. Oktober 2011.
  16. ^ "Math_error - Fehler aus mathematischen Funktionen erkennen". Man7.org. 2008-08-11. Abgerufen 2014-03-13.
  17. ^ "Baum". Man.Freebebsd.org. 2007-12-27. Abgerufen 2013-08-25.
  18. ^ "BSD Cross Referenz des Super -Benutzers: /openbsd/sys/sys/tree.h". bxr.su.
  19. ^ "Warteschlange". Man.Freebebsd.org. 2011-05-13. Abgerufen 2013-08-25.
  20. ^ "BSD Cross Referenz des Super -Benutzers: /openbsd/sys/sys/queue.h". bxr.su.
  21. ^ "fgetln". Man.Freebebsd.org. 1994-04-19. Abgerufen 2013-08-25.
  22. ^ "Super -Benutzer BSD Cross Referenz: /openbsd/lib/libc/stdio/fgetln.c". bxr.su.
  23. ^ "BSD Cross Referenz des Super -Benutzers: /openbsd/include/stdio.h". bxr.su.
  24. ^ "FTS". Man.Freebebsd.org. 2012-03-18. Abgerufen 2013-08-25.
  25. ^ "BSD Cross Referenz des Super -Benutzers: /openbsd/include/fts.h". bxr.su.
  26. ^ "DB". Man.Freebebsd.org. 2010-09-10. Abgerufen 2013-08-25.
  27. ^ "BSD Cross Referenz des Super -Benutzers: /openbsd/include/db.h". bxr.su.
  28. ^ Miller, Todd C. und Theo de Raadt. STRLCPY und STRLCAT - Konsistent, sicher, Stringkopie und Verkettung.Proceedings der Usenix Annual Technical Conference von 1999, 6. bis 11. Juni 1999, S. 175–178.
  29. ^ "Super -Benutzer BSD Cross Referenz: /openbsd/lib/libc/string/strlcat.c". bxr.su.
  30. ^ "Super -Benutzer -BSD Cross Referenz: /openbsd/lib/libc/string/strlcpy.c". bxr.su.
  31. ^ "Super -Benutzer -BSD Cross Referenz: /openbsd/lib/libc/string/strncat.c". bxr.su.
  32. ^ "BSD Cross Referenz des Superbenutzers: /openbsd/lib/libc/string/strncpy.c". bxr.su.
  33. ^ "irren". Man.Freebebsd.org. 2012-03-29. Abgerufen 2013-08-25.
  34. ^ "BSD Cross Referenz des Super -Benutzers: /openbsd/include/err.h". bxr.su.
  35. ^ "vis (3)". Man.Freebebsd.org. Abgerufen 14. September 2013.
  36. ^ "BSD Cross Referenz des Super -Benutzers: /openbsd/lib/libc/gen/vis.c". bxr.su.
  37. ^ "BSD Cross Referenz des Super -Benutzers: /openbsd/include/vis.h". bxr.su.
  38. ^ "Die Python -Standardbibliothek: 6.9. Dateiobjekte". Docs.python.org. Abgerufen 28. Oktober 2011.
  39. ^ "libc". Rostkisten. Archiviert von das Original am 18. August 2016. Abgerufen 31. Juli 2016.

Weitere Lektüre

  • Plauger, P.J. (1992). Die Standard -C -Bibliothek (1 ed.).Prentice Hall. ISBN 978-0131315099.

Externe Links