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?
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).
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>
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.
getch()
ogetchar()
?– Sourav Ghosh
13 abr 2015 a las 18:15
El no estándar
getch()
es enconio.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 usargetchar()
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