¿Por qué mingw-gcc permite que getch() se use incondicionalmente?

2022-10-06 23:23:21

Recientemente comencé a portar una TONELADA de mis programas C a un entorno Windows, desde mi anterior PC de desarrollo con Linux. Noté algo un poco raro en la implementación de GCC de Windows de mingw.

En Windows, encontré una hermosa función llamada getch. Es fácil, es inmediato... y además no es estándar.

Me gustaría centrarme en la parte "no estándar". Específicamente, quiero saber por qué mingw-gcc me permite usarlo, sin usar nada más que las bibliotecas estándar.

Supongamos que tenemos un programa que imprime "Hello, World!", un NL y CR, y luego espera una clave y un retorno:

#include <stdio.h>
int main(void)
{
    char str[14] = "Hello, World!"; //13 characters and a terminator
    printf("%s\n\r", str);
    scanf("%c");
    return 0;
}

Ahora, cambiemos un poco de ese programa para usar getch:

#include <stdio.h>
int main(void)
{
    char str[14] = "Hello, World!"; //Again, 13 characters and a terminator
    printf("%s\n\r", str);
    getch(); //See? now it uses getch.
    return 0;
}

La parte interesante es: ¿no es getch una llamada realizada por la biblioteca conio.h para entornos DOS/Win32 antiguos? El compilador ni siquiera da una advertencia. ¿Por qué funciona esto?

Aquí hay algo que encuentro incluso un poco más inquietante:

int main(void) //literally NOTHING included
{
    getch();
    return 0;
}

¿Qué diablos? Sé con certeza que getch no existe en entornos Linux (de todos modos, de forma nativa). Entonces, ¿de dónde está recibiendo el compilador esta llamada?

Mi mejor suposición (corríjame si me equivoco) es que la decisión de vincular lo que sea que tenga getch se toma en el momento del enlace, no en el momento de la compilación.

En cualquier caso, esto me parece un poco extraño. ¿Por qué una implementación de GCC incluye automáticamente claramente capacidad no estándar en Windows?

- Mason Watmough

Source
zh
Responder


1
  • El paso de compilación funciona (aunque debería generar una advertencia) porque, tradicionalmente, C le permite llamar a funciones que no han sido declaradas, siempre que devuelvan un int que hace getch().

    El paso de vinculación funciona porque la biblioteca de tiempo de ejecución de C que usa MinGW es una sola biblioteca, es decir, proporciona todas las funciones de la biblioteca de tiempo de ejecución de Visual C, incluidas las no estándar. MinGW presumiblemente se vincula con él de forma predeterminada porque (aparte de los casos extremos muy raros) siempre es necesario, incluso si todo lo que desea es una función principal () que no hace nada. :-)


    También se debe mencionar que la biblioteca en cuestión no es oficialmente compatible con el uso de terceros, excepto por aplicaciones creadas en Visual Studio 6. Los tiempos de ejecución más modernos han obsoleto getch a favor de el equivalente pero compatible con los estándares _getch, pero VS6 es anterior a ese cambio.