4

Estoy haciendo un menú de opciones usando do while bastante sencillo, pero después de ver algunos vídeos en yt decidí probar con el llamado "menú de opciones con flechas", donde hay una flecha de la forma ==> que apunta a cada opción del menú y que se va desplazando utilizando las flechas direccionales del teclado.

En los vídeos que vi se utiliza la librería conio.h o una variante conio2.h. Los autores de los vídeos usan dicha librería para poder llamar a la función getch() que, según entendí, sirve para utilizar las flechas direccionales.

En uno de los vídeos, por ejemplo, se hace lo siguiente:

#define TECLA_ARRIBA 72
#define TECLA_ABAJO 80
#define ENTER 13

// acá va el código del menú

do
        {
            tecla = getch();
        }
        while(tecla != TECLA_ARRIBA && tecla != TECLA_ABAJO && tecla != ENTER);

Mi duda es que no sé si es correcto utilizar librerías como conio.h o conio2.h pues leí en ciertas webs que estás librerías están deprecadas, además de que su uso es una mala práctica en C++.

Y entonces me preguntaba como se puede utilizar las flechas direccionales en C++ sin utilizar tales librerías. Por otra parte, he probado uno de los programas que vi en el VS 2017 y si compila, siempre que cambie getch() por _getch(). Esto implica que no hay ningún problema en usar la librería conio.h en VS, o de todos modos debería evitarse utilizar tal librería?

Gracias de antemano por sus comentarios y/o respuestas.

Xam
  • 834
  • 3
  • 13
  • 21

1 Answers1

4

conio.h no es estándar.

Mi duda es que no sé si es correcto utilizar librerías como conio.h o conio2.h pues leí en ciertas webs que estás librerías están deprecadas, además de que su uso es una mala práctica en C++.

El problema no reside tanto en que estén deprecadas como en que no son estándar. conio.h no forma parte de las librerías estándar de C. En caso de ser una librería estándar de C, la manera correcta de usarla en C++ sería usando las librerías adaptadas a C++ que tienen una c como prefijo y carecen de extensión. Así pues, si conio.h fuese una librería estándar su versión en el estándar de C++ sería cconio. Consulta este hilo para más detalles.

¿Qué es conio.h?

Esta cabecera es una utilidad proveída por el compilador de la plataforma, declara varias funciones para permitir al usuario interactuar con la consola y las funciones proveídas varían entre compiladores y plataformas, en definitiva no sigue ni el ANSI C ni el POSIX. Ese es el motivo por el que no se recomienda su uso, pues hace que el código no sea portable.

Alternativas.

Me preguntaba como se puede utilizar las flechas direccionales en C++ sin utilizar tales librerías.

Por desgracia C++ no dispone de ninguna utilidad estándar para tratar ese tipo de interacción con el usuario. La consola se lee a través de std::cin que es una capa sobre los búferes de datos que devuelve información ya procesada, las teclas de dirección no se consideran datos.

Para evitar el uso de conio.h deberás consultar tú mismo la documentación de tu plataforma y averiguar de qué manera pueden consultarse las teclas de dirección, lo cuál nos devuelve a los primeros punto: al no estar usando cabeceras estándar tu código no será portable y en consecuencia no se recomienda su uso.

En lugar de usar cabeceras dependientes de plataforma, podrías hacer uso de librerías de terceros que abstraen este proceso, tengo entendido que Boost.Asio es capaz de ello, pero no lo puedo asegurar pues no lo he probado.

¿Tan malo es no ser portable?

He probado uno de los programas que vi en el VS 2017 y si compila.

No es extraño que así sea. Si la portabilidad no es un requerimiento de tu programa, no debería ser problemático usar cabeceras dependientes de plataforma. Sin embargo, el no usar cabeceras estándar puede ser problemático en ocasiones a parte del problema de la portabilidad: estas cabeceras pueden cambiar con mayor frecuencia que las estándar y por ello ser incompatibles o comportarse de manera diferente a cada versión.

Compila, siempre que cambie getch() por _getch().

Los símbolos que empiezan por guión bajo (_) no son palabras reservadas pero están reservados para el uso interno del compilador, no deberías usarlos en tu código.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82