
Salar
Aquí hay un programa que estoy tratando de ejecutar directamente desde la sección 1.9 de “El lenguaje de programación C”.
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void copy(char to[], char from[]);
main()
{
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0)
printf("%s", longest);
return 0;
}
int getline(char s[], int lim)
{
int c, i;
for (i=0; i<lim-1 && (c=getchar()) !=EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
Aquí está el error que recibo cuando intento compilar el programa usando Ubuntu 11.10:
cc word.c -o word
word.c:4:5: error: conflicting types for ‘getline’
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here
word.c:26:5: error: conflicting types for ‘getline’
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here
make: *** [word] Error 1
Solo para asegurarme de que no era un problema con la impresión en el libro, hice referencia a este conjunto de respuestas al final de los ejercicios del capítulo del libro (http://users.powernet.co.uk/eton/kandr2/krx1. html) y obtengo un error similar cuando intento ejecutar los ejercicios 18, 19, 20, 21, etc., desde ese enlace. Es realmente difícil aprender cuando no puedo ejecutar los programas para ver cómo funcionan. Este problema comenzó al introducir matrices de caracteres y llamadas a funciones en un programa. Agradecería cualquier consejo sobre este tema.
El problema es ese getline()
es una función de biblioteca estándar. (definido en stdio.h
) Su función tiene el mismo nombre y, por lo tanto, está en conflicto con ella.
La solución es simplemente cambiar el nombre.

moooeeeeep
La función conflictiva getline()
es una extensión GNU/POSIX.
K&R afirma que se refieren específicamente a ANSI C en su libro (cf), que no proporciona esta función.
Los autores presentan la guía completa de programación en lenguaje C estándar ANSI.
Para configurar gcc en “modo de compatibilidad K&R”, puede especificar los modos ANSI o ISO para la compilación. Estos están destinados a deshabilitar extensiones, por ejemplo, la función getline()
. Esto eventualmente podría eliminar la necesidad de editar otros ejemplos proporcionados por K&R también.
Por ejemplo, la siguiente compilación está bien:
$ gcc test.c -ansi
$ gcc test.c -std=c89
(Excepto que se quejan del tipo de retorno predeterminado implícito de main()
con -Wall
.)
Aparentemente, en algunos sistemas, estos modos pueden no funcionar como se presenta aquí (aparentemente, algunas versiones de Mac OS no pueden deshabilitar correctamente todas las extensiones). Probé esto con éxito en mi máquina:
$ 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.
Esto se debe a que el stdio.h
tener un getline()
función.
Entonces, una cosa simple para hacer que esto funcione sería cambiar el nombre de su función a my_getline()
Ambas cosas getline()
y getdelim()
eran originalmente GNU
extensiones Fueron estandarizados en POSIX.1-2008
.

fge
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here
Eso debería darte una pista. Prueba y renombra el getline()
función en el código a otra cosa.
Asimismo, declarando main()
esta forma es de estilo antiguo. Una función sin argumentos ni tipo de retorno declarado, por defecto, acepta un número no especificado de argumentos y devuelve un int. Este es casi el caso de main()
: devuelve un int, pero tiene dos argumentos. Será mejor que lo declares como:
int main(int argc, char **argv)
o:
int main(int argc, char *argv[])
getline
ahora es una función POSIX declarada en stdio.h
Renombrarte getline
función a otro nombre y se compilará.

carl norum
Tienes que cambiar el nombre de getline porque ya existe.

Mithrandir
Ya existe una función llamada getline definida en el archivo “stdio.h”. Por lo tanto, un conflicto en los prototipos! Cambie el nombre de su función a “my_getline” o algún otro nombre y todo debería estar bien.