web-dev-qa-db-fra.com

Pourquoi SDL définit la macro principale?

Après avoir eu quelques problèmes pour configurer SDL, j'ai découvert que SDL définit une macro qui remplace main:

#define main SDL_main

// And then
extern C_LINKAGE int SDL_main(int argc, char *argv[]);

Cela peut également créer des erreurs de compilation, si la fonction principale n'a pas les paramètres argc et argv définis.

Cette macro me donne des maux de tête juste au moment où je la vois ... Pourquoi SDL doit-il redéfinir le principal? Après quelques recherches supplémentaires, j'ai constaté que certaines personnes #undef main, et utilisez-le normalement.

Voici donc la question: pourquoi SDL doit-il redéfinir main, que fait-il? Y a-t-il des effets secondaires pour le définir?

Une chose que j'ai remarquée est que SDL redirige la sortie standard et les erreurs vers des fichiers (et je ne veux pas de ce comportement), et ce comportement s'arrête si je définis un main.

39
Tibi

Par la FAQ Windows SDL :

Vous devez utiliser main() au lieu de WinMain() même si vous créez une application Windows, car SDL fournit une version de WinMain() qui effectue une initialisation SDL avant d'appeler votre Code principal.

Si pour une raison quelconque vous devez utiliser WinMain(), jetez un œil au code source SDL dans src/main/win32/SDL_main.c Pour voir quel type d'initialisation vous devez faire dans votre WinMain() pour que SDL fonctionne correctement.

SDL nécessite une initialisation, donc il injecte sa propre fonction main qui exécute son initialisation avant d'appeler votre fonction "principale", qu'il renomme en SDL_main Afin qu'elle n'entre pas en conflit avec la réelle main. Comme indiqué dans la FAQ, votre fonction main doit être de la forme

int main(int argc, char* argv[])
41
James McNellis

Bien que je convienne que c'est une pratique étrange, il existe des situations où c'est une solution raisonnable, même si cela dépend en grande partie de la plate-forme. Considérez que différentes plates-formes ont des points d'entrée différents. Windows est généralement WinMain, Linux est principal et interagit avec Android se produit en Java, WinRT utilise des extensions C++/CX, etc.). Le point d'entrée du programme et les API peuvent être très spécifiques à la plate-forme et SDL essaie de vous évite d'avoir à faire face à cela. Si vous ne ciblez que Windows et que SDL n'est là que pour vous éviter d'avoir à travailler avec l'API WIN32, vous n'en aurez peut-être pas besoin. Mais si vous allez au-delà du bureau, vous " ll le trouvera utile à mon avis.

7
Mel