Konfliktní funkce getline()
je rozšíření GNU/POSIX.
K&R uvádí, že se ve své knize konkrétně zabývají ANSI C (srov.), která tuto funkci neposkytuje.
Autoři předkládají kompletního průvodce programováním v jazyce C podle standardu ANSI.
Chcete-li nastavit gcc do "režimu kompatibility K&R", můžete určit režimy ANSI nebo ISO pro kompilaci. Ty jsou určeny k deaktivaci rozšíření, např. funkce getline()
.To by nakonec mohlo eliminovat potřebu upravovat i další příklady poskytované K&R.
Například následující kompilace v pohodě:
$ gcc test.c -ansi
$ gcc test.c -std=c89
(Až na to, že si stěžují na implicitní výchozí návratový typ main()
s -Wall
.)
Na některých systémech tyto režimy zjevně nemusí fungovat tak, jak je zde uvedeno (zřejmě některé verze systému Mac OS nedokážou správně zakázat všechna rozšíření). Úspěšně jsem to otestoval na svém počítači:
$ 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.
Problém je v tom, že getline()
je standardní funkce knihovny. (definováno v stdio.h
) Vaše funkce má stejný název, a proto s ní koliduje.
Řešením je jednoduše změnit název.
Je to proto, že stdio.h
mít getline()
funkce.
Takže jednoduchá věc, aby to fungovalo, by bylo přejmenovat vaši funkci na my_getline()
Oba getline()
a getdelim()
byly původně GNU
rozšíření. Byly standardizovány v POSIX.1-2008
.