Die widersprüchliche Funktion getline()
ist eine GNU/POSIX-Erweiterung.
K&R gibt an, dass sie sich in ihrem Buch speziell mit ANSI C befassen (vgl.), das diese Funktion nicht bietet.
Die Autoren präsentieren den vollständigen Leitfaden zur Programmiersprache ANSI-Standard C.
Um gcc in den "K&R-Kompatibilitätsmodus" zu versetzen, können Sie den ANSI- oder ISO-Modus für die Kompilierung angeben. Diese sollen Erweiterungen deaktivieren, z. B. die Funktion getline()
.Dies könnte letztendlich die Notwendigkeit beseitigen, andere von K&R bereitgestellte Beispiele ebenfalls zu bearbeiten.
Zum Beispiel lässt sich Folgendes gut kompilieren:
$ gcc test.c -ansi
$ gcc test.c -std=c89
(Außer, dass sie sich über den impliziten Standardrückgabetyp von main()
beschweren mit -Wall
.)
Anscheinend funktionieren diese Modi auf einigen Systemen möglicherweise nicht wie hier dargestellt (anscheinend können einige Versionen von Mac OS nicht alle Erweiterungen korrekt deaktivieren). Ich habe dies erfolgreich auf meinem Rechner getestet:
$ gcc --version
gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8)
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Das Problem ist, dass getline()
ist eine Standardbibliotheksfunktion. (definiert in stdio.h
) Ihre Funktion hat denselben Namen und kollidiert damit.
Die Lösung besteht darin, einfach den Namen zu ändern.
Das liegt daran, dass stdio.h
einen getline()
haben Funktion.
Eine einfache Sache, um dies zum Laufen zu bringen, wäre also, Ihre Funktion in my_getline()
umzubenennen
Beide getline()
und getdelim()
waren ursprünglich GNU
Erweiterungen. Sie wurden in POSIX.1-2008
standardisiert .