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
.