¿Por qué SDL define la macro principal?

4 minutos de lectura

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 mainy 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.

  • 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

¿Por que SDL define la macro principal
james mcnellis

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[])

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

    –David Grayson

    15 de agosto de 2012 a las 19:52

  • @DavidGrayson realmente es una práctica muy pobre, especialmente si tiene dos bibliotecas que hacen esto … un dolor enorme en el patooty

    – Capitán Obvio

    15 de agosto de 2012 a las 19:54

  • ¿Puedo escribir mi propia implementación de main(), en lugar de usar esta extraña función SDL_main()? Hay algunas cosas (por ejemplo, la redirección de stdout) que se me meten en la garganta y no las quiero.

    – Tibi

    15 de agosto de 2012 a las 20:06


  • De acuerdo con David. Esta macro es una técnica C. C++ tiene muchas alternativas sanas.

    – MSalters

    16 de agosto de 2012 a las 8:56

  • No solo estoy de acuerdo con David en que esto es una mala práctica, sino que SDL tiene su propia llamada SDL_init para la inicialización. Por lo que recuerdo, la inicialización en SDLmain fue bastante inútil (redireccionamiento de la consola, si mal no recuerdo)

    – BlakBat

    22 de agosto de 2012 a las 13:01

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.

  • “Más allá del escritorio” – ¡oye! Linux y OsX también son de escritorio.

    – val sigue con Monica

    10 de marzo de 2019 a las 13:09

  • “Windows suele ser WinMain” en cualquier cadena de herramientas MinGW, puede usar C o C++ estándar main y MinGW hará el trabajo para que funcione.

    – Xeveroso

    26 de febrero de 2021 a las 18:29

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad