Darf eine ANSI C-konforme Implementierung zusätzliche Typen und Funktionen in ihrer Standardbibliothek enthalten, die über die vom Standard aufgezählten hinausgehen? (Eine ideale Antwort würde den relevanten Teil des ANSI-Standards referenzieren.)
Ich frage insbesondere, weil Mac OS 10.7 die Funktion getline
in stdio.h deklariert, sogar wenn mit gcc oder clang mit dem -ansi
Flag kompiliert wird. Dies unterbricht mehrere ältere Programme, die ihre eigene Funktion getline
definieren. Ist das ein Fehler von Mac OS 10.7? (Die Manpage für getline
unter Mac OS 10.7 besagt, dass getline
dem 2008 eingeführten POSIX.1-Standard entspricht.)
Edit: Zur Verdeutlichung finde ich es merkwürdig, dass das Einschließen von stdio.h in einem ANSI C89-Programm unter Mac OS 10.7 auch die Deklaration für die getline
-Funktion einbezieht, da getline
keine der Funktionen in ist die K & R (und vermutlich ANSI) Beschreibung von stdio.h. Insbesondere versuchen Sie, noweb zu kompilieren:
Ist es ein Fehler in Mac OS 10.7, der die Deklaration von getline
in stdio.h selbst beim Kompilieren für den ANSI C89-Standard enthält?
Aus Abschnitt 7.1.3 Absatz 2 von n1570 (was ein Entwurf von C1x ist):
Keine anderen Kennungen sind reserviert.
Dies ist der Teil, der bedeutet, dass getline
nicht von <stdio.h>
definiert werden sollte, da es kein reservierter Bezeichner gemäß der Spezifikation ist. Wenn Ihre Bibliothek also getline
in <stdio.h>
definiert, ist es technisch nicht konform mit dem C-Standard ...
Sie sollten jedoch in der Lage sein, die Feature-Test-Makros zu verwenden, um zu bewirken, dass getline
in <stdio.h>
undefiniert ist.
Damit erhalten Sie nur die Definitionen der älteren POSIX-Standards. Dies wird bei einigen GNU C ++ - Implementierungen, die für einige Leute ExTremely fruSTRaTiNG sind, nicht funktionieren.
Der relevante Teil der Manpage ist (aus einer Glibc-Manpage entnommen, sorry ...)
%Vor% Dieser Teil der Manpage sagt Ihnen, welche Makros für welche Werte definiert werden müssen, um die Definition zu erhalten. Meine Wette ist, dass _POSIX_C_SOURCE
bereits von Ihrem Compiler zu 200809L
definiert wurde.
Die Idee von Feature-Test-Makros besteht darin, dass Sie, wenn Sie Ihre Makros wie _POSIX_C_SOURCE
, _BSD_SOURCE
, _XOPEN_SOURCE
usw. auf die gewünschten Werte festlegen, keine neuen Funktionen kollidieren müssen mit Ihren bestehenden Funktionen. Es gibt auch _GNU_SOURCE
, was alles aktiviert, wenn Sie glibc verwenden, aber ich schlage vor, diesem Makro einen weiten Bogen zu geben.
Ja, eine konforme Implementierung darf zusätzliche Kennungen einschließlich Funktionen definieren, solange sie eine der reservierten Kennungen im Standard sind. Zum Beispiel:
Alle Bezeichner, die mit einem Unterstrich und einem Großbuchstaben oder einem anderen beginnen Unterstriche sind immer für jede Verwendung reserviert;
Alle Bezeichner, die mit einem Unterstrich beginnen, sind immer für die Verwendung als Bezeichner reserviert mit dem Dateibereich sowohl im gewöhnlichen als auch im Tag-Namensraum;
Alle externen Namen, die mit is
, to
, str
, mem
oder wcs
gefolgt von einem Kleinbuchstaben beginnen;
Darüber hinaus gibt es Namen, die nur reserviert sind, wenn Sie bestimmte Header enthalten; Wenn Sie beispielsweise <errno.h>
einschließen, kann ein beliebiges Makro definiert werden, das mit E
gefolgt von einer Ziffer oder einem Großbuchstaben beginnt.
Allerdings ist getline()
nicht so ein reservierter Name, und eine konforme Implementierung muss sie für den Programmierer selbst verfügbar machen.