ritchie - the c programming language amazon
¿Por qué aparece un error de "tipos conflictivos para getline" al compilar el ejemplo de línea más larga en el capítulo 1 de K & R2? (7)
Debes cambiar el nombre de getline porque ya existe.
Aquí hay un programa que intento ejecutar directamente desde la sección 1.9 de "The C Programming Language".
#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;
}
Este es el error que recibo cuando trato de 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 letra impresa en el libro, hice referencia a este conjunto de respuestas al final de los ejercicios 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 salen. Este problema comenzó cuando se introdujeron arreglos de caracteres y llamadas a funciones en un programa. Agradecería cualquier consejo sobre este tema.
El problema es que getline()
es una función de biblioteca estándar. (definido en stdio.h
) Su función tiene el mismo nombre y, por lo tanto, choca con ella.
La solución es simplemente cambiar el nombre.
El ya es una función llamada getline definida en el archivo "stdio.h". ¡Así un conflicto en prototipos! Cambia el nombre de tu función a "my_getline" u otro nombre y todo estará bien.
Esto se debe a que stdio.h
tiene una función getline()
.
Así que una cosa simple para que esto funcione sería cambiar el nombre de tu función a my_getline()
Tanto getline()
como getdelim()
eran originalmente extensiones de GNU
. Fueron estandarizados en POSIX.1-2008
.
La función conflictiva getline()
es una extensión GNU / POSIX.
K & R dice que abordan específicamente ANSI C en su libro (c.f.) , que no proporciona esta función.
Los autores presentan la guía completa de la programación de lenguaje estándar C de ANSI.
Para establecer 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, los siguientes compilan muy 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í (al parecer, algunas versiones de Mac OS no pueden desactivar 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.
/usr/include/stdio.h:671:20: note: previous declaration of ''getline'' was here
Eso debería darte una pista. Intenta cambiar el nombre de la función getline()
en el código por otra cosa.
Además, declarar main()
esta manera es old style. Una función sin argumentos y tipos de devolución declarados, por defecto, acepta un número no especificado de argumentos y devuelve un int. Este es casi el caso para main()
: devuelve un int, pero tiene dos argumentos. Es mejor que lo declares como:
int main(int argc, char **argv)
o:
int main(int argc, char *argv[])
getline
es ahora una función POSIX declarada en stdio.h
Cambie el nombre de la función getline
a otro nombre y se compilará.