Después de tener algunos problemas para configurar SDL, descubrí que SDL define una macro que reemplaza a main:
#define main SDL_main
// And then
extern C_LINKAGE int SDL_main(int argc, char *argv[]);
Esto también puede crear errores de compilación, si la función principal no tiene la argc
y argv
parámetros definidos.
Esta macro me da dolores de cabeza justo cuando la veo… ¿Por qué SDL necesita redefinir main? Después de buscar un poco más, descubrí que algunas personas #undef main
y utilícelo de la manera normal.
Así que esta es la pregunta: ¿Por qué SDL necesita redefinir main? ¿Qué hace? ¿Hay algún efecto secundario al desdefinirlo?
Una cosa que noté es que SDL redirige la salida estándar y el error a los archivos (y no quiero este comportamiento), y este comportamiento se detiene si anulo la definición de main.
Por Preguntas frecuentes sobre Windows de SDL:
deberías estar usando main()
en lugar de WinMain()
aunque esté creando una aplicación de Windows, porque SDL proporciona una versión de WinMain()
que realiza alguna inicialización de SDL antes de llamar a su código principal.
Si por alguna razón necesita utilizar WinMain()
eche un vistazo al código fuente de SDL en src/main/win32/SDL_main.c
para ver qué tipo de inicialización necesita hacer en su WinMain()
para que SDL funcione correctamente.
SDL requiere inicialización, por lo que inyecta su propio main
función que ejecuta su inicialización antes de llamar a su función “principal”, a la que cambia el nombre a SDL_main
para que no entre en conflicto con la realidad main
función. Como se indica en las preguntas frecuentes, su main
la función debe ser de la forma
int main(int argc, char* argv[])
Si bien estoy de acuerdo en que es una práctica extraña, hay situaciones en las que esta es una solución razonable, aunque depende en gran medida de la plataforma. Considere que las diferentes plataformas tienen diferentes puntos de entrada. Windows suele ser WinMain, Linux es principal, la interacción con Android ocurre en Java, WinRT usa extensiones C++/CX, etc. El punto de entrada del programa y las API pueden ser muy específicos de la plataforma y SDL intenta evitarle la molestia de tener que lidiar con esto. Si solo está apuntando a Windows y SDL solo está ahí para ahorrarle la molestia de trabajar con la API WIN32, es posible que no lo necesite. Pero si alguna vez vas más allá del escritorio, lo encontrarás útil en mi opinión.
Puede desactivar este comportamiento.
– Kotauskas
18 de julio de 2019 a las 14:50
Yeesh, mucha ira en este post. La razón principal por la que se hace esto es para abstraer los diferentes puntos de entrada en Windows (winmain) y el punto de entrada tradicional en otras plataformas (int main). Simplifica una gran cantidad de código que, de lo contrario, necesitaría ifdefs o archivos fuente separados. Es un mecanismo de conveniencia y se puede hacer manualmente si así lo desea.
– Qix – MONICA FUE MALTRATADA
25 de diciembre de 2020 a las 21:17