Warum erhalte ich beim Kompilieren des Beispiels mit der längsten Zeile in Kapitel 1 von K&R2 den Fehler „Conflicting Types for Getline“?

Lesezeit: 5 Minuten

Benutzeravatar von Salar
Salz

Hier ist ein Programm, das ich versuche, direkt aus Abschnitt 1.9 von “Die C-Programmiersprache” auszuführen.

#include <stdio.h>
#define MAXLINE 1000

int getline(char line[], int maxline);
void copy(char to[], char from[]);

main()
{
    int len;
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];

    max = 0;
    while ((len = getline(line, MAXLINE)) > 0)
        if (len > max) {
        max = len;
        copy(longest, line);
        }
    if (max > 0)
        printf("%s", longest);
return 0;
}


int getline(char s[], int lim)
{
    int c, i;

    for (i=0; i<lim-1 && (c=getchar()) !=EOF && c != '\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}


void copy(char to[], char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

Hier ist der Fehler, den ich bekomme, wenn ich versuche, das Programm mit Ubuntu 11.10 zu kompilieren:

cc     word.c   -o word
word.c:4:5: error: conflicting types for ‘getline’
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here
word.c:26:5: error: conflicting types for ‘getline’
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here
make: *** [word] Error 1

Nur um sicherzustellen, dass es kein Problem mit dem Druck im Buch gibt, habe ich auf diese Reihe von Antworten zu den Übungen am Ende der Kapitel aus dem Buch verwiesen (http://users.powernet.co.uk/eton/kandr2/krx1. html) und ich erhalte einen ähnlichen Fehler, wenn ich versuche, die Übungen 18, 19, 20, 21 usw. über diesen Link auszuführen. Es ist wirklich schwer zu lernen, wenn ich die Programme nicht ausführen kann, um zu sehen, wie sie ausgegeben werden. Dieses Problem trat auf, als Zeichenfelder und Funktionsaufrufe in einem Programm eingeführt wurden. Ich würde mich über jeden Rat zu diesem Thema freuen.

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.

  • getline() ist nicht eine Standardbibliotheksfunktion, es ist eine Erweiterung, wie @moooeeeep ausführlicher erklärte und auch hier stackoverflow.com/questions/7376566/… von @Dietrich Epp. Wenn Sie also heute codieren, sollten Sie nicht verwenden getline()aber was ist, wenn Sie auf eine Bibliothek angewiesen sind, die bereits ihre selbst implementierte verwendet getline() Funktion? Ich denke, im weitesten Sinne ist die Antwort von @moooeeeep angemessener.

    – Cahit Gungor

    25. Oktober 2015 um 23:35 Uhr


  • Ich verschwendete 3 Bier und zusätzliche 20 Minuten und dachte schließlich daran, es zu googeln.

    – Der Exorzist

    13. April 2018 um 17:59 Uhr

Benutzeravatar von moooeeeep
moooeeep

Die widersprüchliche Funktion getline() ist eine GNU/POSIX-Erweiterung.

K&R gibt an, dass sie sich in ihrem Buch (cf) speziell mit ANSI C befassen, das diese Funktion nicht bietet.

Die Autoren präsentieren den vollständigen Leitfaden zur Programmierung in der ANSI-Standardsprache 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, zB 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 beschweren main() 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 meiner Maschine 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.

  • Ich habe versucht gcc test.c -ansi. Es scheint, dass es nicht funktioniert.

    Benutzer758077

    31. Juli 2017 um 21:38 Uhr

  • @Jack welches Betriebssystem/–Version hast du ausprobiert?

    – muuuuh

    2. August 2017 um 18:49 Uhr

  • Ich verwende macOS Sierra Version 10.12.5. Jeder Ersatz für gcc test.c -ansi in diesem Betriebssystem?

    Benutzer758077

    2. August 2017 um 19:02 Uhr

  • Vielleicht könnten Sie Folgendes versuchen: stackoverflow.com/q/7376566/1025391 Ansonsten müssen Sie die Funktion möglicherweise umbenennen 🙁

    – muuuuh

    4. August 2017 um 6:21 Uhr

Dies liegt daran, dass die stdio.h haben eine getline() Funktion.

Eine einfache Sache, um dies zum Laufen zu bringen, wäre also, Ihre Funktion in umzubenennen my_getline()

Beide getline() und getdelim() waren ursprünglich GNU Erweiterungen. Sie wurden in standardisiert POSIX.1-2008.

  • Das ist die richtige Antwort auf die Frage. Nicht, wie man es repariert, aber warum scheitert es, wenn das Buch von Experten geschrieben wurde? “Weil das Buch geschrieben wurde, als getline noch nicht standardisiert war.” Ahhh, danke.

    – Mimorale

    19. September 2013 um 12:41 Uhr

  • @mikiemorales Das Buch wurde nach einem anderen Standard geschrieben. Siehe meine Antwort: stackoverflow.com/a/17378451/1025391

    – muuuuh

    27. Februar 2014 um 7:48 Uhr

Benutzeravatar von fge
fge

/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here

Das sollte dir einen Hinweis geben. Versuchen Sie, die umzubenennen getline() Funktion im Code zu etwas anderem.

Auch deklarieren main() dieser Weg ist im alten Stil. Eine Funktion ohne deklarierten Rückgabetyp und Argumente akzeptiert standardmäßig eine unbestimmte Anzahl von Argumenten und gibt ein int zurück. Dies ist fast der Fall für main(): Es gibt ein int zurück, hat aber zwei Argumente. Sie sollten es besser deklarieren als:

int main(int argc, char **argv)

oder:

int main(int argc, char *argv[])

getline ist jetzt eine in deklarierte POSIX-Funktion stdio.h

Benennen Sie sich um getline Funktion auf einen anderen Namen und es wird kompiliert.

Benutzeravatar von Carl Norum
Karl Norum

Sie müssen den Namen von getline ändern, da er bereits existiert.

Mithrandirs Benutzeravatar
Mithrandir

Das ist bereits eine Funktion namens getline, die in der Datei “stdio.h” definiert ist. Also ein Konflikt in Prototypen! Benennen Sie Ihre Funktion in “my_getline” oder einen anderen Namen um und alles sollte in Ordnung sein!

1399740cookie-checkWarum erhalte ich beim Kompilieren des Beispiels mit der längsten Zeile in Kapitel 1 von K&R2 den Fehler „Conflicting Types for Getline“?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy