GNU/Linux >> Znalost Linux >  >> Linux

Proč se mi při kompilaci příkladu nejdelšího řádku v kapitole 1 K&R2 zobrazují konfliktní typy chyby getline?

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 .


Linux
  1. Proč „zip“ v A For Loop funguje, když soubor existuje, ale ne, když neexistuje?

  2. Trap, Err, A Echoing the Error Line?

  3. Získat procento využití pro Mount Point?

  1. 8 tipů pro příkazový řádek Linuxu

  2. Seřadit pomocí řazení na příkazovém řádku

  3. Kdy zkontrolovat EINTR a opakovat volání funkce?

  1. Bash tipy pro každý den na příkazovém řádku

  2. Kdy se zobrazí chybová zpráva „pracovní místa:nenalezena“?

  3. Jak se připojit k dalšímu řádku, když řádek odpovídá regulárnímu výrazu pro celý dokument ve VI?