Kann eine ANSI C-konforme Implementierung zusätzliche Funktionen in ihre Standardbibliothek aufnehmen?

8

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:

%Vor%

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?

    
Bradford Larsen 11.09.2011, 05:53
quelle

2 Antworten

12

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.

%Vor%

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.

    
Dietrich Epp 11.09.2011, 06:16
quelle
4

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.

    
caf 11.09.2011 09:50
quelle

Tags und Links