¿Por qué SDL define la macro principal?


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 los parámetros argc y argv definidos.

Esta macro me da dolores de cabeza justo cuando la veo... ¿Por qué SDL necesita redefinir main? Después de un poco más de búsqueda, encontré que algunas personas #undef main, y lo utilizan de la manera normal.

Así que esta es la pregunta: por qué SDL necesita para redefinir main, ¿qué hace? ¿Hay algún efecto secundario al no definirlo?

Una cosa que he notado es que SDL redirige la salida estándar y el error a archivos (y no quiero este comportamiento), y este comportamiento se detiene si desactivo main.

 32
Author: Tibi, 2012-08-15

2 answers

Por el SDL Windows FAQ :

Debería usar main() en lugar de WinMain() aunque esté creando una aplicación para Windows, porque SDL proporciona una versión de WinMain() que realiza alguna inicialización SDL antes de llamar a su código principal.

Si por alguna razón necesita usar 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 función WinMain() para que SDL funcione correctamente.

SDL requiere inicialización, por lo que inyecta su propia función main que ejecuta su inicialización antes de llamar a su función "principal", que cambia el nombre a SDL_main para que no entre en conflicto con la función main real. Como se indica en las preguntas frecuentes, su función main debe tener la forma

int main(int argc, char* argv[])
 32
Author: James McNellis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-15 19:49:18

Aunque 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. Tenga en cuenta que las diferentes plataformas tienen diferentes puntos de entrada. Windows es típicamente WinMain, Linux es principal, la interacción con Android ocurre en Java, WinRT utiliza extensiones C++ / CX, y así sucesivamente. El punto de entrada del programa y las API pueden ser muy específicos de la plataforma y SDL intenta ahorrarle la molestia de tener que lidiar con esto. Si solo estás segmentando Windows y SDL solo están ahí para ahorrarle la molestia de trabajar con la API WIN32, es posible que no la necesite. Pero si alguna vez vas más allá del escritorio, lo encontrarás útil en mi opinión.

 5
Author: Mel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-10 07:31:36