2009-05-02 20 views
12

En algún lugar atrás en el tiempo hice algo de C y C++ en la universidad, pero no presté mucha atención a C++. Ahora deseo prestarle atención a C++ pero cuando estoy usando la función getch(), recibo la advertencia de abajo.getch está en desuso

Advertencia C4996: 'getch': El nombre POSIX de este elemento está en desuso. En su lugar, use el nombre conforme con ISO C++: _getch. Consulte la ayuda en línea para obtener detalles.

Ahora, estoy usando VS 2005 express, y no sé qué hacer con esta advertencia. Necesito usar getch() después de I printf() un mensaje de error u otra cosa que requiera una pulsación de tecla.

¿Me pueden ayudar con eso?

+3

¿Leyó el mensaje de error? – jalf

+2

@jalf: El "mensaje de error" es incorrecto/engañoso, por lo que no veo cómo leerlo ayudaría ... –

+12

@R ..: No, no lo es. Indica muy claramente el motivo del compilador para emitir la advertencia, y establece con la misma claridad qué es lo que quieren que hagas * para evitar * la advertencia. Es posible que usted y yo no estemos de acuerdo con la decisión unilateral de Microsoft de "depreciar" las funciones estándar, pero la advertencia explica muy claramente el problema, ya sea que usted esté de acuerdo o no con el razonamiento subyacente. Si desea que la advertencia desaparezca, y la advertencia en realidad dice "utilice esta función", leer la advertencia ciertamente ayuda. – jalf

Respuesta

23

Microsoft decidió marcar el nombre sin subrayar obsoleto, porque esos nombres están reservados para que el programador elije. Las extensiones específicas de implementación deben usar nombres que comiencen con un guión bajo en el espacio de nombres global si desean adherirse al Estándar C o C++, o deben marcarse como un entorno estándar combinado combinado, como POSIX/ANSI/ISO C, donde tal función entonces corresponde a uno de esos estándares.

Lea this answer about getcwd() también, para una explicación de P. J. Plauger, que sabe cosas muy bien, por supuesto.

Si solo está interesado en esperar algunas teclas escritas por el usuario, no hay ninguna razón para no usar getchar. Pero a veces es más práctico y conveniente para el usuario usar _getch y amigos. Sin embargo, esos no están especificados por el Estándar C o C++ y, por lo tanto, limitarán la portabilidad de su programa. Mantenlo en mente.

+0

En realidad, hay una diferencia entre getchar y getch. obtener bloques hasta que se presione alguna tecla. getchar bloques hasta que se presione enter. –

2

¿Por qué necesita esto? ¿Por qué no usar getchar() si necesita capturar un solo personaje?

+9

getchar está almacenado en la línea, por lo que esperará a que aparezca un carácter de nueva línea. _getch() no lo hará, pero regresa inmediatamente. Puedo entenderlo a veces es realmente útil ("presionar x para acercar", por ejemplo). –

+1

No creo que tenga nada que ver con el almacenamiento en búfer. getchar() lee en un personaje a la vez. Entonces hay fgets y todo el rango de funciones de Xscanf() (aunque es difícil de usar). Pero como dije, es difícil sugerir algo sin el contexto adecuado, particularmente una extensión no estándar. – dirkgently

9

Si te interesa C++, ¿por qué printf y getch? Considere usar cout y cin.get en su lugar.

+0

No estoy seguro de que cin/cing.get funcione, por ejemplo, con las teclas de flecha – tagoma

3

Como dice el error, el nombre getch() está en desuso (ya que era una extensión específica de Microsoft), y en su lugar se recomienda _getch(). No estoy seguro de dónde entra POSIX; POSIX no define getch(), sino que incluye getchar() como se especifica en el ISO C standard (página 298, borrador vinculado porque el estándar final no es gratuito). La solución sería hacer lo sugerido y usar _getch(), o usar el estándar C getchar().

+1

'getch' tiene poco que ver con' getchar'. Más bien es una interfaz conio (y creo que también curses) cuyo propósito es leer de forma interactiva un solo carácter del teclado sin almacenamiento en búfer/demora. –

+0

POSIX no entra en el caso de esta función en particular, pero * la mayoría de las funciones que estaban en desuso en favor de las versiones de guiones bajos eran funciones similares a POSIX como 'abrir' o' mkdir'. Supongo que simplemente no querían molestarse en crear un mensaje de advertencia por separado para las pocas excepciones. –

4

use _getch() en lugar de getch()

+2

¿Podría explicar por qué el usuario debe usar uno en lugar del otro? Reparar el problema es bueno, pero entender el problema y por qué la solución funciona es aún mejor. – MCeley

Cuestiones relacionadas