2012-08-15 31 views
28

Después de la creación de SDL algunos problemas, descubrí que SDL define una macro que reemplaza principal:¿Por qué SDL define la macro principal?

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

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

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

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 no defino main.

Respuesta

29

por the SDL Windows FAQ:

Debería utilizar main() en lugar de WinMain() a pesar de que se está creando una aplicación de Windows, ya que SDL proporciona una versión de WinMain() que realiza alguna inicialización de SDL antes de llamar al código principal.

Si por alguna razón es necesario utilizar WinMain(), echar un vistazo al código fuente SDL en src/main/win32/SDL_main.c para ver qué tipo de inicialización que tiene que hacer en su función de manera que WinMain() SDL funciona correctamente.

SDL requiere inicialización, por lo que inyecta su propia función main que se ejecuta la inicialización antes de llamar a la función "principal", que renombra a SDL_main de manera que no entre en conflicto con la función real main. Como se ha señalado en el FAQ, su función main debe ser de la forma

int main(int argc, char* argv[]) 
+15

Casi todas las bibliotecas requieren inicialización, pero esto parece una mala práctica para saber cómo hacerlo. +1 de todos modos. –

+12

@DavidGrayson una práctica muy pobre de hecho, especialmente si tiene dos bibliotecas que hacen esto ... dolor masivo en la patootía –

+0

¿Puedo escribir mi propia implementación de main(), en lugar de usar esta extraña función SDL_main()? Hay algunas cosas (por ejemplo, redirección de stdout) que son como empujadas por mi garganta, y no lo quiero. – Tibi

5

Aunque estoy de acuerdo que es una práctica extraña, hay situaciones en que esto sea una solución razonable, aunque depende mucho de la plataforma. Considere que las diferentes plataformas tienen diferentes puntos de entrada. Windows es típicamente WinMain, Linux es principal, interactúa con Android en Java, WinRT usa extensiones de 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 apuntas a Windows y SDL solo está ahí para ahorrarte la molestia de trabajar con la API de WIN32, es posible que no la necesites. Pero si alguna vez vas más allá del escritorio, lo encontrarás útil en mi opinión.

Cuestiones relacionadas