declaración implícita de la función ‘obtener’

5 minutos de lectura

avatar de usuario
jim jim

Tengo un programa simple:

#include <stdio.h>
#include <stdlib.h>

int main(void){
    printf("Hello world!\n");

    getch();

    return 0;
}

Aunque recibo la advertencia

implicit declaration of function 'getch'

el programa corre bien. ¿Echo de menos algo? Y si lo hago, ¿por qué el programa funciona bien?

  • getch() o getchar()?

    – Sourav Ghosh

    13 abr 2015 a las 18:15

  • El no estándar getch() es en conio.h (también no estándar), que no incluyó. “Funciona” porque el tipo de retorno es compatible con el tipo de retorno implícito asumido por el compilador: int. En resumen, tuviste (des) suerte. Considere usar getchar() en cambio.

    – WhozCraig

    13 de abril de 2015 a las 18:16


  • Gracias @WhozCraig por tu comentario (si fuera una respuesta, aceptaría con gusto)

    – jim jim

    13 de abril de 2015 a las 18:26

  • Me rasco la cabeza por el voto negativo. ¿Hay algo malo con la pregunta? por favor ayúdame a mejorar downvoter.

    – jim jim

    13 abr 2015 a las 18:36

  • La sugerencia de información sobre herramientas para la votación de preguntas incluye el comentario “…muestra esfuerzo de investigación”, quizás fue eso (no yo). La advertencia del compilador de MSVC es más útil: “advertencia C4013: ‘obtener’ indefinido; asumiendo que externo regresa int”

    – Veleta

    13 de abril de 2015 a las 18:48


avatar de usuario
keith thompson

Recibes la advertencia

implicit declaration of function 'getch'

porque no has incluido ningún encabezado que declare getch. No se declara tal función en los encabezados estándar. <stdio.h> o <stdlib.h>.

De hecho, no hay ninguna función llamada getch en ninguna encabezado C estándar.

Antes del estándar C99, el lenguaje C permitía llamadas a funciones sin declaración visible. Tal llamada en efecto crearía una declaración implícita de una función que regresa int y tomando argumentos de cualquier tipo (promocionado) que realmente aprobó.

Dependiendo de esto nunca ha sido una buena idea. Debería siempre tener un adecuado #include directiva para el encabezado que declara cualquier función de biblioteca que use en su programa.

C99 eliminó el “implícito int” regla e hizo cualquier llamada a una función sin una declaración visible a violación de restricciónque requiere un diagnóstico (se permite que ese diagnóstico sea un error no fatal).

Si está compilando en Windows, si no recuerdo mal, hay un getch() función declarada en <conio.h>. Si desea utilizar esa función, debe agregar #include <conio.h> a su programa.

No recomiendo hacer esto; utilizando getch() es innecesario y hace que su programa no sea portátil. Algunos entornos de desarrollo de Windows dificultan la ejecución de “programas de consola” (programas que imprimen en salida estándar en lugar de crear una GUI); a menudo, ejecutar un programa de este tipo crea una ventana temporal que se destruye tan pronto como finaliza el programa. Llamando al estándar getchar() La función es otra forma de evitar que la ventana desaparezca. O puede ejecutar el programa desde un símbolo del sistema y su salida aparecerá en su ventana de comandos actual.

Si está compilando en un sistema similar a UNIX, hay otra función llamada getch()declarado en <curses.h>. Puedo compilar y ejecutar su programa en Linux si agrego -lcurses a la línea de comandos del compilador. Pero no deberías usar eso getch() funcione si no ha configurado primero el entorno de curses, y está bastante claro que no quiere hacer eso.

Idealmente, el programa clásico “hola mundo” debería ser simplemente:

#include <stdio.h>
int main(void) {
    printf("Hello world!\n");
    return 0;
}

La forma en que se ejecuta y le permite ver el resultado depende de su entorno (del cual no nos ha informado).

  • Estoy en una máquina con Windows 7, code::blocks ide, compilador gcc. Solo quiero que el programa se detenga y presione una tecla para salir. getchar() funciona bien pero tengo que presionar enter además. Gracias por su tiempo y su detallada respuesta 🙂

    – jim jim

    13/04/2015 a las 19:32


  • @jimjim: Puede simplemente presionar , no es necesario escribir otro carácter primero. Puedes intentar algo como printf("Type <return> to quit: "); fflush(stdout); getchar();. O puede ejecutar el programa desde una ventana de comandos y dejar que se ejecute hasta que finalice. (Puede haber una manera de invocar el Windows getch() en su entorno, pero no conozco los detalles. Puede ser tan simple como agregar #include <conio.h>.)

    –Keith Thompson

    13/04/2015 a las 19:49


  • En gcc, ¿por qué necesita detener el programa?

    – Vishal Kumar Sahu

    25 de marzo de 2017 a las 11:54

avatar de usuario
Deanie

Para linux, use este código:

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int getch (void)
{
        int ch;
        struct termios oldt, newt;

        tcgetattr(STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~(ICANON|ECHO);
        tcsetattr(STDIN_FILENO, TCSANOW, &newt);
        ch = getchar();
        tcsetattr(STDIN_FILENO, TCSANOW, &oldt);

        return ch;
}

Para Windows, agregue esta línea:

#include <conio.h>

  • Gracias por su respuesta. Estoy usando windows 7.

    – jim jim

    13/04/2015 a las 18:33

  • Como no hay aclaración en la pregunta, esta respuesta parece estar en referencia a gcc …

    – Vishal Kumar Sahu

    25 de marzo de 2017 a las 11:55

  • Tal vez explique un poco, que esto es cambiar la terminal del modo de línea al modo de caracteres, y luego de vuelta.

    – Zan Lince

    6 de agosto de 2018 a las 19:47

Me quedé atascado en Mac, por el uso de getch(), ya que quería detener la pantalla en ciertas condiciones, así que así lo descubrí:

#include <stdlib.h>



int main()

{

 system( "read -n 1 -s -p \"Press any key to continue...\"" );

 return 0;

}

Espero eso ayude.

¿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