La fonction conflictuelle getline() est une extension GNU/POSIX.
K&R déclarent qu'ils traitent spécifiquement ANSI C dans leur livre (cf.), 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. Celles-ci sont destinées à désactiver les extensions, par exemple la fonction getline() .Cela pourrait éventuellement éliminer le besoin de modifier également d'autres exemples fournis par K&R.
Par exemple, la compilation suivante fonctionne parfaitement :
$ gcc test.c -ansi
$ gcc test.c -std=c89
(Sauf qu'ils se plaignent du type de retour par défaut implicite de main() avec -Wall .)
Apparemment, sur certains systèmes, ces modes peuvent ne pas fonctionner comme présenté ici (apparemment, certaines versions de Mac OS ne parviennent pas à désactiver correctement toutes les extensions). J'ai testé ceci 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.
Le problème est que getline() est une fonction de bibliothèque standard. (défini dans stdio.h ) Votre fonction porte le même nom et entre donc en conflit avec lui.
La solution consiste simplement à changer le nom.
C'est parce que le stdio.h avoir un getline() fonction.
Donc, une chose simple pour que cela fonctionne serait de renommer votre fonction en my_getline()
Les deux getline() et getdelim() étaient à l'origine GNU extensions. Ils ont été standardisés en POSIX.1-2008 .