Pourquoi ai-je une erreur "conflicting types for getline" lors de la compilation de l'exemple de ligne Le plus long dans le chapitre 1 de K&R2?

Voici un programme que j'essaie d'exécuter directement à partir de la section 1.9 du "langage de programmation C".

#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] = '';
    return i;
}


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

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

Voici l'erreur que je reçois lorsque j'essaie de compiler le programme en utilisant Ubuntu 11.10:

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

Juste pour s'assurer que ce n'était pas un problème avec l'impression dans le livre, j'ai référencé cet ensemble de réponses aux exercices de retour de chapitre du livre (http://users.powernet.co.uk/eton/kandr2/krx1.html) et je reçois une erreur similaire quand j'essaie d'exécuter des exercices 18, 19, 20, 21,etc., à partir de ce lien. Il est vraiment difficile d'apprendre quand je ne peux pas exécuter les programmes pour voir comment ils sortent. Ce problème a commencé lors de l'introduction de tableaux de caractères et d'appels de fonctions dans un programme. J'apprécierais tout conseil sur cette question.

31
demandé sur systemovich 2012-01-06 23:07:10

7 réponses

Le problème est que getline() est une fonction de la bibliothèque standard. (défini dans stdio.h) Votre fonction a le même nom et est donc en conflit avec elle.

La solution consiste simplement à changer le nom.

33
répondu Mysticial 2012-01-06 19:09:25

La fonction conflictuelle getline() est une extension GNU/POSIX.

K & R indiquent qu'ils traitent spécifiquement ANSI C dans leur livre (C. F.) , qui ne fournit pas cette fonction.

Les auteurs présentent le guide complet de la programmation en langage C Standard ANSI.

Pour définir gcc en "mode de compatibilité K & R", Vous pouvez spécifier les modes ANSI ou ISO pour la compilation. Ceux-ci sont destinés à désactiver les extensions, par exemple, la fonction getline(). Ce pourrait éventuellement éliminer la nécessité de modifier d'autres exemples fournis par K&R ainsi.

Par exemple, la compilation suivante est très bien:

$ gcc test.c -ansi
$ gcc test.c -std=c89

(sauf qu'ils se plaignent du type de retour implicite par défaut de main() avec -Wall.)

Apparantly sur certains systèmes, ces modes peuvent ne pas fonctionner comme présenté ici ( apparantly certaines versions de Mac OS ne parviennent pas à désactiver correctement toutes les extensions ). J'ai testé cela avec succès sur ma machine:

$ 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.
31
répondu moooeeeep 2017-05-23 12:34:14

C'est parce que les stdio.h ont une fonction getline().

, Donc une chose simple à faire ce travail serait de renommer votre fonction de my_getline()

Les Deux getline() et getdelim() étaient à l'origine des extensions GNU. Ils ont été normalisés dans POSIX.1-2008.

8
répondu Sangeeth Saravanaraj 2012-01-06 19:10:56

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

Cela devrait vous donner un indice. Essayez de renommer la fonction getline() dans le code en autre chose.

Aussi, déclarer main() de cette façon est un style ancien. Une fonction sans Type de retour déclaré et arguments, par défaut, accepte un nombre non spécifié d'arguments et renvoie un int. C'est presque le cas pour main(): il renvoie un int, mais a deux arguments. Vous feriez mieux de le déclarer comme:

int main(int argc, char **argv)

Ou:

int main(int argc, char *argv[])
3
répondu fge 2012-01-06 19:19:31

getline est maintenant une fonction POSIX déclarée dans stdio.h

Renommez votre Fonction getline en un autre nom et elle compilera.

2
répondu ouah 2012-01-06 19:11:03

Vous devez changer le nom de getline car il existe déjà.

2
répondu BlackBear 2012-01-06 19:13:39

Le est déjà une fonction appelée getline définie dans le " stdio.h" fichier. Donc un conflit dans les prototypes! Renommez votre fonction en "my_getline" ou un autre nom et tout devrait aller bien!

1
répondu Mithrandir 2012-01-06 19:12:25