La funzione in conflitto getline()
è un'estensione GNU/POSIX.
K&R afferma di affrontare specificamente ANSI C nel loro libro (cf), che non fornisce questa funzione.
Gli autori presentano la guida completa alla programmazione in linguaggio C standard ANSI.
Per impostare gcc in "modalità di compatibilità K&R" è possibile specificare le modalità ANSI o ISO per la compilazione. Questi hanno lo scopo di disabilitare le estensioni, ad esempio la funzione getline()
.Questo potrebbe eventualmente eliminare la necessità di modificare anche altri esempi forniti da K&R.
Ad esempio, la seguente compilazione va bene:
$ gcc test.c -ansi
$ gcc test.c -std=c89
(Tranne che si lamentano del tipo di ritorno predefinito implicito di main()
con -Wall
.)
Apparentemente su alcuni sistemi, queste modalità potrebbero non funzionare come presentato qui (apparentemente alcune versioni di Mac OS non riescono a disabilitare correttamente tutte le estensioni). L'ho testato con successo sulla mia macchina:
$ 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.
Il problema è che getline()
è una funzione di libreria standard. (definito in stdio.h
) La tua funzione ha lo stesso nome e quindi è in conflitto con essa.
La soluzione è cambiare semplicemente il nome.
Questo perché il stdio.h
avere un getline()
funzione.
Quindi una cosa semplice per farlo funzionare sarebbe rinominare la tua funzione in my_getline()
Entrambi getline()
e getdelim()
originariamente erano GNU
estensioni. Sono stati standardizzati in POSIX.1-2008
.