¿Por qué recibo un error de “tipos en conflicto para getline” al compilar el ejemplo de la línea más larga en el capítulo 1 de K&R2?

5 minutos de lectura

¿Por que recibo un error de tipos en conflicto para
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.

  • obtener línea() es no una función de biblioteca estándar, es una extensión, como dijo @moooeeeep más en profundidad y también aquí stackoverflow.com/questions/7376566/… por @Dietrich Epp. Entonces, si está programando hoy, no debe usar getline()pero ¿qué sucede si depende de una biblioteca que ya utiliza su propio getline() ¿función? Creo que, en un sentido amplio, la respuesta de @moooeeeep es más apropiada.

    – Cahit Gungor

    25/10/2015 a las 23:35


  • Desperdicié 3 cervezas y 20 minutos adicionales y finalmente pensé en buscarlo en Google.

    – El exorcista

    13 de abril de 2018 a las 17:59

¿Por que recibo un error de tipos en conflicto para
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.

  • Yo he tratado gcc test.c -ansi. Parece que no funciona.

    usuario758077

    31 de julio de 2017 a las 21:38

  • @Jack, ¿qué sistema operativo/–versión probaste?

    – mooooooooooooooooooooooo

    2 de agosto de 2017 a las 18:49

  • Uso macOS Sierra versión 10.12.5. Cualquier sustitución de gcc test.c -ansi en este sistema operativo?

    usuario758077

    02/08/2017 a las 19:02

  • Tal vez podría probar esto: stackoverflow.com/q/7376566/1025391 aparte de eso, es posible que deba cambiar el nombre de la función 🙁

    – mooooooooooooooooooooooo

    4 de agosto de 2017 a las 6:21

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.

  • Esta es la respuesta correcta a la pregunta. No cómo solucionarlo, pero ¿por qué falla si el libro está escrito por expertos? “Porque el libro fue escrito cuando getline aún no estaba estandarizado”. Ahhh, gracias.

    – mimoralea

    19 de septiembre de 2013 a las 12:41

  • @mikiemorales El libro fue escrito de acuerdo con otro estándar. Vea mi respuesta: stackoverflow.com/a/17378451/1025391

    – mooooooooooooooooooooooo

    27 de febrero de 2014 a las 7:48

¿Por que recibo un error de tipos en conflicto para
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á.

1647541569 460 ¿Por que recibo un error de tipos en conflicto para
carl norum

Tienes que cambiar el nombre de getline porque ya existe.

1647541570 963 ¿Por que recibo un error de tipos en conflicto para
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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad